如何根据一个绝对文件路径生成一个相对文件路径

 

日常的开发中,获取绝对文件路径才是主流吧!连 Path.GetFullPath 这种生成绝对路径的方法都已经成为 .NET Standard 的一部分了。

然而,生成相对路径依然有用——比如你的配置文件是相对于工作目录的,必须这个路径是输出给用户看的……


那么,既然 Path 没有生成相对路径的方法,还能怎么生成相对路径呢?别跟我说自己去做字符串比较……

Uri 却提供了 MakeRelativeUri 方法,可以生成一个路径到另一个路径的相对路径。于是我们可以写出这样的代码:

public static string MakeRelativePath(string fromPath, string toPath)
{
    var fromUri = new Uri(fromPath);
    var toUri = new Uri(toPath);
    var relativeUri = fromUri.MakeRelativeUri(toUri);
    return Uri.UnescapeDataString(relativeUri.ToString());
}

运行传入 C:\Users\walterlv\OpenSource\DemoC:\Users\walterlv\OpenSource\Demo\build\config.xml。结果,竟然得到的相对路径是:Demo/build/config.xml

  1. 那个 Demo 明明是两者共有的路径部分,却存在于相对路径中;
  2. 生成的路径使用 /,而不是 Windows 系统使用的 \

于是我们需要分别进行这两个处理。对于前者,我们必须让 Uri 意识到这是一个文件夹才能让最终生成的路径不带这个重复的部分;对于后者,我们需要进行路径连接符转换。于是最终的代码我整理成了如下方法:

public static string MakeRelativePath(string fromPath, string toPath)
{
    if (string.IsNullOrEmpty(fromPath)) throw new ArgumentNullException(nameof(fromPath));
    if (string.IsNullOrEmpty(toPath)) throw new ArgumentNullException(nameof(toPath));

    var fromUri = new Uri(fromPath);
    var toUri = new Uri(toPath);

    if (fromUri.Scheme != toUri.Scheme)
    {
        // 不是同一种路径,无法转换成相对路径。
        return toPath;
    }

    if (fromUri.Scheme.Equals("file", StringComparison.InvariantCultureIgnoreCase)
        && !fromPath.EndsWith("/") && !fromPath.EndsWith("\\"))
    {
        // 如果是文件系统,则视来源路径为文件夹。
        fromUri = new Uri(fromPath + Path.DirectorySeparatorChar);
    }

    var relativeUri = fromUri.MakeRelativeUri(toUri);
    var relativePath = Uri.UnescapeDataString(relativeUri.ToString());

    if (toUri.Scheme.Equals("file", StringComparison.InvariantCultureIgnoreCase))
    {
        relativePath = relativePath.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar);
    }

    return relativePath;
}

现在重新传入 C:\Users\walterlv\OpenSource\DemoC:\Users\walterlv\OpenSource\Demo\build\config.xml。结果,已经能够得到:build\config.xml 了。


参考资料

转载于:https://www.cnblogs.com/walterlv/p/10236449.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值