【问题标题】:How to get minimal absolute path from relative path without any permission checks?如何在没有任何权限检查的情况下从相对路径获取最小绝对路径?
【发布时间】: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

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

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

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

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

因此,如果我只想最小化任意路径字符串,GetFullPath 不起作用:取决于路径是否恰好存在于运行应用程序的系统上,如果用户无权访问该路径。

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

【问题讨论】:

标签: c# .net path filenames


【解决方案1】:

你可以使用Uri类的AbsolutePath

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

【讨论】:

  • 至少在dotnetfiddle 上,这将返回C:/abc/def 而不是C:\abc\def。现在,我意识到(基于Path.DirectorySeparatorChar/)dotnetfiddle 可能在 Linux 上内部使用 Mono - 但在这种情况下,C:\abc\xyz 不应该是一个无效的路径开始,或者``被解释为转义字符?
  • @F-H C:/abc/def 是有效路径。你可以通过new DirectoryInfo("c:/abc/xyz").GetFiles();试试看
  • 嗯 ...至少this answer 暗示基于 URI 的方法不适用于使用这些路径分隔符。我在那里要求澄清。在任何情况下,一个小缺点可能是向用户输出这样的路径(这也是我想最小化它的原因,出于显示原因)可能会有点令人困惑,因为他们会期望反斜杠。
  • 然而,这个答案的一个真正问题是它破坏了 UNC 路径。服务器名称将不会出现在结果中。也许我可以检查主机是localhost 还是它的任何别名,并根据它使用AbsolutePathLocalPath (?)
  • 更新:使用LocalPath,在 Windows 上运行时使用反斜杠。所以,LocalPath 看起来比 AbsolutePath 更有希望。
【解决方案2】:

如果你想通过System.IO 使用它,你会遇到访问冲突问题。

为什么要增加异常发生的时间?

GetFullPath 周围使用try {} catch {} 并就地处理错误将是我的建议。

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

【讨论】:

  • 什么错误?我不期待任何错误。为什么我会遇到任何访问冲突?
  • 你不想使用 GetFullPath 因为 - 如果文件存在 - 它可能会由于实际进入文件系统而产生异常 - 如果用户无法访问它。然后你想使用 System.IO.-Stuff 访问完全相同的路径 - 所以你会遇到同样的问题。如果用户有权限,你的罚款,如果没有,例外。如果发生异常,您只需推迟异常(及其处理)。
  • “所以你会遇到同样的问题”——不,我不会。我没有说我要在进行字符串操作的同时进行System.IO 调用。它们可能确实会在以后发生(当权限或手头的目录结构的其他事情发生变化时),或者在另一个用户帐户中(具有不同的权限)。或者,我什至可能不会将这些具体字符串与System.IO 方法一起使用,但如果设置了权限,我需要它们在理论上对System.IO 方法有效。
猜你喜欢
  • 2010-09-21
  • 1970-01-01
  • 2014-03-09
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 2015-05-17
相关资源
最近更新 更多