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