c# - 从相对 URI 计算本地路径的正确方法

标签 c# vb.net winforms uri

似乎没有标准方法来计算 LocalPath来自亲戚URI (此属性仅对绝对 URI 有效),与 Path.Combine 结合使用,例如将其与文件掩码 (*.ext) 组合。问题是MakeRelativeUri生成类似于 my%20folder/ 的内容,而不是 myfolder\

这是我发现的解决方法:

Module Module1
  Sub Main()
    Dim path1 As String = "C:\my folder\"
    Dim path2 As String = "C:\"
    MsgBox(GetPathDiff(path1, path2)) 'outputs "my folder\" (without quotes)
  End Sub

  Private Function GetPathDiff(path1 As String, path2 As String) As String
    Dim uri1 As New Uri(path1)
    Dim uri2 As New Uri(path2)
    Dim uri3 As Uri = uri2.MakeRelativeUri(uri1)
    Return Uri.UnescapeDataString(uri3.OriginalString).Replace("/", "\")
  End Function
End Module

我发现这是一种相当笨拙的方法,并且可能有一些我还没有偶然发现的隐藏的石头,即这种方法对于不同的用例并不是 100% 稳定。

有更好的方法吗?

最佳答案

(注意:与其说是一个答案,不如说是一种哀叹,但我希望其中一些内容能提供一些信息。)

如果您在这里尝试执行的是获取两个文件系统路径之间的相对路径,那么您最好坚持使用文件系统 API。

最初的问题是Calculating the path relative to some root- the inverse of Path.Combine看起来和你的目标是一样的,在我对这一段进行编辑之前,我建议看看它。但经过仔细检查,发现我撰写本文时的解决方案并不是那么好。

我对 Uri 的担心是它是围绕 URI 路径的规则设计的,这些规则不一定与文件系统路径的规则相同。例如,URI 规范规定路径段为“.”。是“旨在在相对路径引用的开头使用”,而对于文件系统路径,将它们放在路径中间是完全合法的(如果有点奇怪)。例如。 c:\.\a\.\b\.\c 是合法的,与 c:\a\b\c 含义相同。

众所周知,文件系统规范化很容易出错,因此很可能存在比这更微妙的问题。

因此从理论上讲,特定于文件系统的 API 会比使用设计用于处理 URI 的代码更好,希望它能产生适用于文件系统的结果。实际上,.NET 似乎没有提供用于计算相对路径的文件系统感知 API,令人惊讶的是,用于此确切目的的 Win32 API PathRelativePathTo 得到了“.”。问题错误...

关于c# - 从相对 URI 计算本地路径的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14757759/

相关文章:

c# - System.Diagnostics.Debug 类是否有 TextWriter 接口(interface)?

.net - 如何使用反射在 VB.NET 模块中设置字段值?

c# - 在下游生成新的 Windows 窗体时如何使用 DI?

c# - 双击后禁用展开

c# - 删除查询中的内部连接有那么糟糕吗?

c# - 通过连接字符串连接到远程数据库

c# - 使用 C# 从 LINQ Query DateTime 字段计算年龄(或年份)进行比较(Age From)

asp.net - Google reCaptcha V2 实现 VB.net

wpf - VB.Net中的图像比较

c# - 绑定(bind)的 UserControl 未更新数据源