如果能够轻松(尽可能使用一些现有设施),如何将c:\aaa\bbb\..\ccc
之类的路径转换为c:\aaa\ccc
?
答案 0 :(得分:52)
我会这样写:
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:\ PROGRAM FILES
不一致的目录定界符
C:/ Documents \ abc.txt - > C:\文件\的abc.txt
除此之外,它可以忽略大小写,尾随\
目录分隔符等。
答案 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 会更好。