【发布时间】:2018-03-19 16:32:43
【问题描述】:
假设我有两个路径字符串,一个是绝对的,例如@"C:\abc\xyz",另一个是相对的,例如@"..\def"。我如何可靠地将它们组合起来以产生最小的形式@"C:\abc\def"?
因为该进程应该适用于 .NET 的 I/O API 支持的任何形式的路径(即 .NET 或 Mono 当前运行的系统的本机路径,或者类似 UNC 路径等),手动字符串操作似乎太不可靠了。
一般来说,组合路径字符串的简洁方法是使用Path.Combine method:
Path.Combine(@"C:\abc\xyz", @"..\def")
不幸的是,它没有最小化路径并返回C:\abc\xyz\..\def。
正如其他几个问题(例如this 或this)中所建议的,GetFullPath method 应该应用于结果:
Path.GetFullPath(Path.Combine(@"C:\abc\xyz", @"..\def"))
问题在于GetFullPath 实际上是查看文件系统,而不仅仅是处理路径字符串。来自docs:
path指定的文件或目录不需要存在。 (...) 但是,如果 path 确实存在,则调用者必须有权获取 path 的路径信息。请注意,与 Path 类的大多数成员不同,此方法访问文件系统。
因此,如果我只想最小化任意路径字符串,GetFullPath 不起作用:取决于路径是否恰好存在于运行应用程序的系统上,如果用户无权访问该路径。
那么,我如何可靠地组合System.IO 方法可以处理的路径字符串以返回最短的绝对路径?
【问题讨论】:
-
@Fabjan:
Directory.GetParent也会检查权限。只需尝试在 dotnetfiddle 上运行它。