如何从相对路径获取最小绝对路径而不进行任何权限检查?

时间:2017-10-08 10:15:46

标签: c# .net path filenames

说,我有两个路径字符串,一个绝对的路径字符串,如@"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

正如其他几个问题(例如thisthis)中所建议的那样,GetFullPath method应该应用于结果:

Path.GetFullPath(Path.Combine(@"C:\abc\xyz", @"..\def"))

问题在于GetFullPath实际上是在查看文件系统,而不仅仅是处理路径字符串。来自docs

  

path 指定的文件或目录不需要存在。 (...)但是,如果 path 确实存在,则调用者必须有权获取 path 的路径信息。请注意,与Path类的大多数成员不同,此方法访问文件系统。

因此,如果我只想最小化任意路径字符串,则GetFullPath不起作用:根据路径是否恰好存在于运行应用程序的系统上,该方法可能会失败并显示{ {1}}如果用户无权访问该路径。

那么,如何可靠地组合可由SecurityException方法处理的路径字符串以返回尽可能短的绝对路径?

2 个答案:

答案 0 :(得分:1)

您可以使用Uri类的AbsolutePath

var path = new Uri(Path.Combine(@"C:\abc\xyz", @"..\def")).AbsolutePath;

答案 1 :(得分:-1)

如果您想通过System.IO使用它,那么您将遇到访问冲突问题。

为什么要花费时间来增加异常来的时间?

try {} catch {}周围使用GetFullPath并根据我的建议处理错误。

  

那么,如何可靠地组合可由System.IO方法处理的路径字符串以返回尽可能短的绝对路径?