56

如何以最少的努力(如果可能的话,使用一些现有的设施)将路径转换c:\aaa\bbb\..\cccc:\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:\Progra~1\ -> C:\程序文件

  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类的主要职责之一。

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 回答