相対パスを絶対パスに変換する。(System.Uri)

相対パスは、あるフォルダを基準とした場合のパス情報です。基準となるディレクトリはカレントディレクトリが使用される場合が多いですが、任意のディレクトリを指定した相対パスを使う場合もあります。カレントディレクトリを基準とする場合は、相対パスのままでも処理を行うことができますが、任意のディレクトリを使用する場合は、絶対パスに変換したあとで使用することになります。

相対パス

..\..\text.txt(カレントディレクトリをc:\users\administrator\appdata\とした場合、絶対パスはc:\users\text.txtとなる。)

相対パス絶対パスに変換する場合は、System.Uriクラスを使用します。基準となるディレクトリでUriクラスを生成し、基準クラスと相対パスから別のUriクラスを作成することで相対パス絶対パスに変換することができます。


Dim baseUri As New System.Uri(targetBasePath)
Dim absUri As New System.Uri(baseUri, relatePath)

Return absUri.LocalPath

System.Uriクラスを使用した相対パス絶対パス変換は注意する点が一つあります。基準となるディレクトリのパス名の末尾にパスセパレータ(\)が必要な事です。パスセパレータが無い場合は、基準となるディレクトリの末尾のディレクトリはファイル名と解釈され無視されます。

基準ディレクトリ(c:\users\administrator\appdata)、相対パス(text.txt)の場合、絶対パス(c:\users\administrator\text.txt)

基準ディレクトリ(c:\users\administrator\appdata\)、相対パス(text.txt)の場合、絶対パス(c:\users\administrator\appdata\text.txt)

上記を考慮して相対パス絶対パス変換を実装すると以下のようになります。


Private Function GetAbsolutePath(ByVal basePath As String, ByVal relatePath As String) As String

Dim targetBasePath As String = basePath
If basePath.Length > 0 Then
If (basePath.Substring(basePath.Length - 1, 1) <> "\") AndAlso (basePath.Substring(basePath.Length - 1, 1) <> "/") Then
targetBasePath += "\"
End If
End If

Dim baseUri As New System.Uri(targetBasePath)
Dim absUri As New System.Uri(baseUri, relatePath)

Return absUri.LocalPath

End Function

カレントディレクトリを基準として、相対パス絶対パスに変換する際はSystem.IO.Path.GetFullPathを使用します。Uriクラスの様な末尾がパスセパレータ(\)である場合の考慮は必要ありません。

System.IO.Path.GetFullPath(f)