正規化された絶対パスを取得するにはGetFullPathメソッドを使います。 このメソッドを呼び出すと、相対パスは解決された状態になり、正規化された絶対パス・ルートディレクトリを基準(あるいは基点、base)とするパスが返されます。 カレントドライブからの相対パス(\
で始まるパス)の場合も、ドライブ名を含む絶対パスに正規化されます。
.NET Standard 2.1/.NET Core 2.1以降では引数basePathを指定することができ、このパスを基準として相対パスが解決されます。 basePathには実在しないパスを指定することもできます。
また、basePathは常にディレクトリを表すものとして扱われるため、basePathがディレクトリ区切り文字で終端されているかどうかによって結果が変わることはありません。 当然、basePathに相対パスを指定することはできません
Path.GetFullPathメソッドで特定のディレクトリを基準として絶対パスを取得・正規化する .NET Standard 2.1/.NET Core 2.1
Imports System
Imports System.IO
Imports System.Runtime.InteropServices
Class Sample
Shared Sub Main()
' 基準ディレクトリ(相対パスを絶対パスに変換する際の基準となるディレクトリ)
Dim baseDir As String = If(RuntimeInformation.IsOSPlatform(OSPlatform.Windows), "C:\Users\user\", "/home/user/")
Console.WriteLine("base directory: {0}", baseDir)
Console.WriteLine()
For Each p As String In New String() {
"E:\dir\subdir\file.txt", ' 絶対パス (Windows形式)
"/dir/subdir/file.txt", ' 絶対パス (UNIX形式)
"E:\dir\subdir\.\file.txt", ' カレントディレクトリからの相対パスを含むパス (Windows形式)
"/dir/subdir/.\file.txt", ' カレントディレクトリからの相対パスを含むパス (UNIX形式)
"E:\dir\subdir\..\file.txt", ' 親ディレクトリからの相対パスを含むパス (Windows形式)
"/dir/subdir/..\file.txt", ' 親ディレクトリからの相対パスを含むパス (UNIX形式)
"\dir\subdir\file.txt", ' カレントドライブからの相対パス (Windows形式)
".\file.txt", ' カレントディレクトリからの相対パス (Windows形式)
"./file.txt", ' カレントディレクトリからの相対パス (UNIX形式)
"..\file.txt", ' 親ディレクトリからの相対パス (Windows形式)
"../file.txt", ' 親ディレクトリからの相対パス (UNIX形式)
"file.txt" ' ファイル名のみのパス
}
Console.WriteLine("path = {0}", p)
Console.WriteLine("full path = {0}", Path.GetFullPath(p, baseDir)) ' baseDirを基準に正規化した絶対パスを取得する
Console.WriteLine()
Next
End Sub
End Class
実行結果
base directory: C:\Users\user\ path = E:\dir\subdir\file.txt full path = E:\dir\subdir\file.txt path = /dir/subdir/file.txt full path = C:\dir\subdir\file.txt path = E:\dir\subdir\.\file.txt full path = E:\dir\subdir\file.txt path = /dir/subdir/.\file.txt full path = C:\dir\subdir\file.txt path = E:\dir\subdir\..\file.txt full path = E:\dir\file.txt path = /dir/subdir/..\file.txt full path = C:\dir\file.txt path = \dir\subdir\file.txt full path = C:\dir\subdir\file.txt path = .\file.txt full path = C:\Users\user\file.txt path = ./file.txt full path = C:\Users\user\file.txt path = ..\file.txt full path = C:\Users\file.txt path = ../file.txt full path = C:\Users\file.txt path = file.txt full path = C:\Users\user\file.txt
実行結果
base directory: /home/user/ path = E:\dir\subdir\file.txt full path = /home/user/E:\dir\subdir\file.txt path = /dir/subdir/file.txt full path = /dir/subdir/file.txt path = E:\dir\subdir\.\file.txt full path = /home/user/E:\dir\subdir\.\file.txt path = /dir/subdir/.\file.txt full path = /dir/subdir/.\file.txt path = E:\dir\subdir\..\file.txt full path = /home/user/E:\dir\subdir\..\file.txt path = /dir/subdir/..\file.txt full path = /dir/subdir/..\file.txt path = \dir\subdir\file.txt full path = /home/user/\dir\subdir\file.txt path = .\file.txt full path = /home/user/.\file.txt path = ./file.txt full path = /home/user/file.txt path = ..\file.txt full path = /home/user/..\file.txt path = ../file.txt full path = /home/file.txt path = file.txt full path = /home/user/file.txt
引数basePathを指定しないバージョンのGetFullPathメソッドを呼び出した場合、相対パスは常にカレントディレクトリを基準として解決されます。
Path.GetRelativePathメソッドを使うことで相対パスを取得することができます。
カレントディレクトリの取得・設定についてはプロセス・アセンブリの情報 §.カレントディレクトリを参照してください。