【发布时间】:2010-11-18 23:54:05
【问题描述】:
如何以最小的努力(如果可能,使用一些现有的设施)将c:\aaa\bbb\..\ccc 之类的路径转换为c:\aaa\ccc?
【问题讨论】:
如何以最小的努力(如果可能,使用一些现有的设施)将c:\aaa\bbb\..\ccc 之类的路径转换为c:\aaa\ccc?
【问题讨论】:
Path.GetFullPath 或许?
【讨论】:
规范化是 .NET 中 Uri 类的主要职责之一。
var path = @"c:\aaa\bbb\..\ccc";
var canonicalPath = new Uri(path).LocalPath; // c:\aaa\ccc
【讨论】:
Uri 类只负责生成路径。不考虑与这些路径相关的系统。通过我的答案中的方法获得路径后,您仍然需要通过 File 类(或其他)检查它是否存在。
我会这样写:
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:\Progra~1\ -> C:\程序文件
目录分隔符不一致
C:/Documents\abc.txt -> C:\DOCUMENTS\ABC.TXT
除此之外,它可以忽略大小写,尾随\目录分隔符等。
【讨论】:
NormalizePath 的这种变体将文件复制或移动到某个地方,她/他很可能希望大小写不会改变。作为用户,我会禁止任何更改我精心维护的家庭命名系统的此类程序。
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 会更好。
【讨论】: