如何用最小的力气(如果可能的话,使用一些已经存在的工具)将路径转换成 c:\aaa\ccc
,例如 c:\aaa\bbb\..\ccc
?
我会这样写:
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:\DOCUMENTS\ABC.TXT
除了上述情况外,它可以忽略大小写、末尾的 \
目录分隔符等。
Path.GetFullPath
也许可以?
规范化是 .NET 中 Uri 类的主要职责之一。
var path = @"c:\aaa\bbb\..\ccc";
var canonicalPath = new Uri(path).LocalPath; // c:\aaa\ccc
Uri
类只负责生成路径。与这些路径相关的系统不被考虑在内。一旦你通过我的答案中的方法获取了路径,你仍然需要通过File
类(或其他方式)检查它是否存在。 - bdukes+
、空格和其他字符。 - mihcaFileInfo对象在这里也可以提供帮助。(https://learn.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更好。