相対パスを絶対パスに変換する。(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)

System.IO.Directory.CreateDirectoryは親ディレクトリが存在しない場合、親を含めて作成する。(SysUtils.ForceDirectories)

Delphiでは、CreateDir関数とは別にForceDirectories関数があり親ディレクトリが無い場合に親ディレクトリまで作成する関数があります。.Netでは、どうやれば良いかと確認すると、System.IO.CreateDirectory関数がForceDirectories関数と同じ動作をすることが分かりました。

以下のコードでネストが深いフォルダを1回で作成できます。


Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim sPath As String = "C:\Users\Administrator\AppData\Local\Temp\a\b\c\d\e\f"

If System.IO.Directory.Exists(sPath) = False Then
System.IO.Directory.CreateDirectory(sPath)
End If

End Sub

End Class

指定したパス情報がファイルかフォルダ(ディレクトリー)か判断する。

指定したパス情報がファイル名かフォルダ名か判断するにはSystem.IO.File.Exists関数とSystem.IO.Directory.Exists関数を使います。File.Exists関数は、指定したパスがフォルダとして存在している場合でもファイルではない場合はFalseを返します。また、Directory.Exists関数は、指定したパスがファイルとして存在している場合でも、フォルダではない場合はFalseを返します。この特性を利用して以下のように判定します。


Public Enum FileSystemType
None = 1
File
Directory
End Enum

Public Function GetFileSystemType(ByVal path As String) As FileSystemType

If System.IO.File.Exists(path) = True Then
Return FileSystemType.File
ElseIf System.IO.Directory.Exists(path) = True Then
Return FileSystemType.Directory
Else
Return FileSystemType.None
End If

End Function

ファイル名の構成要素を分解する。(フルパス、フォルダ、ファイルネーム、ベースネーム、エクステンション)

ファイル名の構成要素を分解した場合の呼び名と取得方法を整理してみます。

フルパス(Full Path)

C:\Users\Administrator\Documents\test.txt

ドライブ名(Drive Name)

C:\

Dim f As String = "C:\Users\Administrator\Documents\test.txt"
Debug.Print(System.IO.Path.GetPathRoot(f))

フォルダ名・ディレクトリ名(Directory Name, Folder Name)

C:\Users\Administrator\Documents

Dim f As String = "C:\Users\Administrator\Documents\test.txt"
Debug.Print(System.IO.Path.GetDirectoryName(f))

ファイル名(File Name)

test.txt

Dim f As String = "C:\Users\Administrator\Documents\test.txt"
Debug.Print(System.IO.Path.GetFileName(f))

ベース名(Base Name)

test

Dim f As String = "C:\Users\Administrator\Documents\test.txt"
Debug.Print(System.IO.Path.GetFileNameWithoutExtension(f))

エクステンション:拡張子(extension)

.txt

Dim f As String = "C:\Users\Administrator\Documents\test.txt"
Debug.Print(System.IO.Path.GetExtension(f))