最小限の労力で(可能であれば既存の機能を使用して)パスを次のようc:\aaa\bbb\..\ccc
に変換するにはどうすればよいc:\aaa\ccc
ですか?
4 に答える
私はそれをこのように書くでしょう:
public static string NormalizePath(string path)
{
return Path.GetFullPath(new Uri(path).LocalPath)
.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)
.ToUpperInvariant();
}
これは、次のようないくつかのシナリオを処理する必要があります
uriとその中の潜在的なエスケープ文字
file:/// C:/Test%20Project.exe-> C:\ TEST PROJECT.EXE
現在のディレクトリまたは親ディレクトリを示すためにドットで指定されたパスセグメント
c:\ aaa \ bbb \ .. \ ccc-> C:\ AAA \ CCC
チルダ短縮(長い)パス
C:\ Program〜1 \-> C:\ PROGRAM FILES
一貫性のないディレクトリ区切り文字
C:/Documents\abc.txt-> C:\ DOCUMENTS \ ABC.TXT
それ以外は、大文字と小文字、末尾の\
ディレクトリ区切り文字などを無視できます。
Path.GetFullPath
多分?
正規化は、.NETのUriクラスの主な責任の1つです。
var path = @"c:\aaa\bbb\..\ccc";
var canonicalPath = new Uri(path).LocalPath; // c:\aaa\ccc
FileInfoオブジェクトもここで役立ちます。(https://docs.microsoft.com/en-us/dotnet/api/system.io.fileinfo?view=net-5.0)
var x = Path.Combine(@"C:\temp", "..\\def/abc");
var y = new FileInfo(x).FullName; // "C:\\def\\abc"
FileInfoとDirectoryInfoは、ファイルとディレクトリの区別を制御する場合にも役立ちます。
ただし、文字列だけが必要な場合は、Path.GetFullPathの方が適しています。