56

最小限の労力で(可能であれば既存の機能を使用して)パスを次のようc:\aaa\bbb\..\cccに変換するにはどうすればよいc:\aaa\cccですか?

4

4 に答える 4

70

私はそれをこのように書くでしょう:

public static string NormalizePath(string path)
{
    return Path.GetFullPath(new Uri(path).LocalPath)
               .TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)
               .ToUpperInvariant();
}

これは、次のようないくつかのシナリオを処理する必要があります

  1. uriとその中の潜在的なエスケープ文字

    file:/// C:/Test%20Project.exe-> C:\ TEST PROJECT.EXE

  2. 現在のディレクトリまたは親ディレクトリを示すためにドットで指定されたパスセグメント

    c:\ aaa \ bbb \ .. \ ccc-> C:\ AAA \ CCC

  3. チルダ短縮(長い)パス

    C:\ Program〜1 \-> C:\ PROGRAM FILES

  4. 一貫性のないディレクトリ区切り文字

    C:/Documents\abc.txt-> C:\ DOCUMENTS \ ABC.TXT

それ以外は、大文字と小文字、末尾の\ディレクトリ区切り文字などを無視できます。

于 2014-01-11T03:15:23.883 に答える
58

Path.GetFullPath多分?

于 2009-08-12T14:50:57.373 に答える
28

正規化は、.NETのUriクラスの主な責任の1つです。

var path = @"c:\aaa\bbb\..\ccc";
var canonicalPath = new Uri(path).LocalPath; // c:\aaa\ccc
于 2009-08-12T14:57:04.133 に答える
1

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の方が適しています。

于 2021-02-15T21:19:07.860 に答える