如何在.NET中获得绝对或规范化的文件路径?

时间:2009-08-12 14:49:31

标签: .net filepath

如果能够轻松(尽可能使用一些现有设施),如何将c:\aaa\bbb\..\ccc之类的路径转换为c:\aaa\ccc

4 个答案:

答案 0 :(得分:52)

我会这样写:

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:\ Progra~1 \ - > C:\ PROGRAM FILES

  4. 不一致的目录定界符

      

    C:/ Documents \ abc.txt - > C:\文件\的abc.txt

  5. 除此之外,它可以忽略大小写,尾随\目录分隔符等。

答案 1 :(得分:34)

或许

Path.GetFullPath

答案 2 :(得分:20)

规范化是.NET中Uri类的主要职责之一。

var path = @"c:\aaa\bbb\..\ccc";
var canonicalPath = new Uri(path).LocalPath; // c:\aaa\ccc

答案 3 :(得分:0)

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 会更好。