如何以最少的努力(如果可能的话,使用一些现有的设施)将路径转换c:\aaa\bbb\..\ccc
为c:\aaa\ccc
?
问问题
28821 次
4 回答
70
我会这样写:
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
除此之外,它可以忽略大小写、尾随\
目录分隔符等。
于 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 回答