正規化された絶対パスを取得するにはGetFullPathメソッドを使います。 このメソッドを呼び出すと、相対パスは解決された状態になり、正規化された絶対パス・ルートディレクトリを基準(あるいは基点、base)とするパスが返されます。 カレントドライブからの相対パス(\
で始まるパス)の場合も、ドライブ名を含む絶対パスに正規化されます。
.NET Standard 2.1/.NET Core 2.1以降では引数basePathを指定することができ、このパスを基準として相対パスが解決されます。 basePathには実在しないパスを指定することもできます。
また、basePathは常にディレクトリを表すものとして扱われるため、basePathがディレクトリ区切り文字で終端されているかどうかによって結果が変わることはありません。 当然、basePathに相対パスを指定することはできません
引数basePathを指定しないバージョンのGetFullPathメソッドを呼び出した場合、相対パスは常にカレントディレクトリを基準として解決されます。
Path.GetFullPathメソッドでカレントディレクトリを基準として絶対パスを取得・正規化する
using System;
using System.IO;
class Sample {
static void Main()
{
// カレントディレクトリを表示(Path.GetFullPathメソッドでの相対パスの解決に使用される)
Console.WriteLine("current directory: {0}", Environment.CurrentDirectory);
Console.WriteLine();
foreach (var path in new[] {
@"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}", path);
Console.WriteLine("full path = {0}", Path.GetFullPath(path)); // 正規化した絶対パスを取得する
Console.WriteLine();
}
}
}
実行結果
current 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
実行結果
current 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
Path.GetRelativePathメソッドを使うことで相対パスを取得することができます。
カレントディレクトリの取得・設定についてはプロセス・アセンブリの情報 §.カレントディレクトリを参照してください。