基于为何我不喜欢用Path.Combine的详解

Path.Combine:

什么时候会用到Path.Combine呢?,当然是连接路径字符串的时候!

所以下面的代码可以完美的工作:

public static void Main()

{

string[] arr_pa = { @"c:\abc\", @"c:\abc" };

string[] arr_pb = { @"test.txt" };

foreach (string pa in arr_pa)

{

foreach (string pb in arr_pb)

{

Console.WriteLine("'{0}' + '{1}'= '{2}'", pa, pb, Path.Combine(pa, pb));

}

}

}

结果如下:

当然你也可以:

Console.WriteLine("'{0}' + '{1}'= '{2}'", pa, pb, Path.Combine(pa, "def", pb));

结果是:

从这个例子可以知道,我们不需要考虑arr_pa里面的字符串是不是以”\” 结尾,这的确提供了方便,而且这也是很多人喜欢使用Path.Combine的一个原因,但是仅此而已。

Path.Combine 虽然解决了路径连接问题,但是由于很多人片面的去理解它,所有它非常容易造成错误的应用,要想用好Path.Combine 并非易事,下面我会列举几个实例来说明这点。

第一个:当path2 是相对路径的时候,返回的是path2,path1会被丢弃。

看一下下面的代码:

public static void Main()

{

string[] arr_pa = { @"c:\abc\", @"c:\abc" };

string[] arr_pb = { @"\test.txt", @"/test.txt", @"test.txt" };

foreach (string pa in arr_pa)

{

foreach (string pb in arr_pb)

{

Console.WriteLine("'{0}' + '{1}'= '{2}'", pa, pb, Path.Combine(pa, pb));

}

}

}

你知道这段代码输出什么吗?

这段代码的输出如下:

可以看到对于”/test.txt” 和”\test.txt” ,Path.Combine 认为path2是相对路径,所以直接返回path2.。

第二点:路径是驱动器,返回的结果不正确

public static void Main()

{

string[] arr_pa = { @"c:", @"c:\" };

string[] arr_pb = { @"\test.txt", @"/test.txt", @"test.txt" };

foreach (string pa in arr_pa)

{

foreach (string pb in arr_pb)

{

Console.WriteLine("'{0}' + '{1}'= '{2}'", pa, pb, Path.Combine(pa, pb));

}

}

}

输出结果是:

可以看到,如果path1 是” C:”的话,那么Path.Combine结果就是不正确的。

第三点:无法连接http路径

除了连接本地路路径之外,有的时候,也需要拼接http链接地址,可惜的是System.IO.Path.Combine却无法拼接http地址。

将arr_pa 修改为

string[] arr_pa = { @"http://www.Test.com/", @"http://www.Test.com" };

结果如下:

在这里就没有什么技巧了,纯粹的死记硬背,

记住,只有

才会产生正确的解。

如果你将代码修改为:

public static void Main()

{

string[] arr_pa = { @"http://www.Test.com/", @"http://www.Test.com" };

string[] arr_pb = { @"\test.txt", @"/test.txt", @"test.txt" };

foreach (string pa in arr_pa)

{

foreach (string pb in arr_pb)

{

Console.WriteLine("'{0}' + '{1}'= '{2}'", pa, pb, Path.Combine(pa, "def", pb));

}

}

}

那么无论怎样,你都无法得到正确的结果:

正是因为上述的几点不足,导致Path.Combine 很难用,这也是有一部分人选择使用String.Format 的原因了。

当然,我写了一个MyPath.Combine的方法,可以解决上面的问题。


代码如下:

class MyPath
    {
        public static string Combine(params string[] paths)
        {
            if (paths.Length == 0)
            {
                throw new ArgumentException("please input path");
            }
            else
            {
                StringBuilder builder = new StringBuilder();
                string spliter = "\\";

string firstPath = paths[0];

if (firstPath.StartsWith("HTTP", StringComparison.OrdinalIgnoreCase))
                {
                    spliter = "/";
                }

if (!firstPath.EndsWith(spliter))
                {
                    firstPath = firstPath + spliter;
                }
                builder.Append(firstPath);

for (int i = 1; i < paths.Length; i++)
                {
                    string nextPath = paths[i];
                    if (nextPath.StartsWith("/") || nextPath.StartsWith("\\"))
                    {
                        nextPath = nextPath.Substring(1);
                    }

if (i != paths.Length - 1)//not the last one
                    {
                        if (nextPath.EndsWith("/") || nextPath.EndsWith("\\"))
                        {
                            nextPath = nextPath.Substring(0, nextPath.Length - 1) + spliter;
                        }
                        else
                        {
                            nextPath = nextPath + spliter;
                        }
                    }

builder.Append(nextPath);
                }

return builder.ToString();
            }
        }
    }

使用也比较简单

例如:

public static void Main()

{

string[] arr_pa = { @"c:\abc\", @"c:\abc", @"http://www.Test.com/", @"http://www.Test.com" };

string[] arr_pb = { @"\test.txt", @"/test.txt", @"test.txt" };

foreach (string pa in arr_pa)

{

foreach (string pb in arr_pb)

{

Console.WriteLine("'{0}' + '{1}'= '{2}'", pa, pb, MyPath.Combine(pa, pb));

}

}

}

结果如下:

当然,你也可以这样:

Console.WriteLine("{0}+{1}+{2}+{3}={4}",

pa, "p2", "\\p3/", pb, MyPath.Combine(pa, "p2", "\\p3/", pb));

输出如下:

最后如果你不用Path.Combine,那么还可以选择string.Format

(0)

相关推荐

  • 基于为何我不喜欢用Path.Combine的详解

    Path.Combine: 什么时候会用到Path.Combine呢?,当然是连接路径字符串的时候! 所以下面的代码可以完美的工作: public static void Main() { string[] arr_pa = { @"c:\abc\", @"c:\abc" }; string[] arr_pb = { @"test.txt" }; foreach (string pa in arr_pa) { foreach (string pb

  • 基于Spring + Spring MVC + Mybatis 高性能web构建实例详解

    一直想写这篇文章,前段时间痴迷于JavaScript.NodeJs.AngularJS,做了大量的研究,对前后端交互有了更深层次的认识. 今天抽个时间写这篇文章,我有预感,这将是一篇很详细的文章,详细的配置,详细的注释,看起来应该很容易懂. 用最合适的技术去实现,并不断追求最佳实践.这就是架构之道. 希望这篇文章能给你们带来一些帮助,同时希望你们可以为这个项目贡献你的想法. 源码地址:https://github.com/Eliteams/quick4j 点击打开 源码地址:https://gi

  • 基于原生ajax与封装的ajax使用方法(详解)

    当我们不会写后端接口来测试ajax时,我们可以使用node环境来模拟一个后端接口. 1.模拟后端接口可参考网站整站开发小例子,在打开命令窗口并转到所在项目文件夹下在命令行中输入npm install express --save,安装express中间件. 2.把当中的app.js的内容换成 var express=require('express'); //var path=require('path'); var app=express(); //app.set('view',path.jo

  • 基于 D3.js 绘制动态进度条的实例详解

    D3 是什么 D3 的全称是(Data-Driven Documents),顾名思义可以知道是一个被数据驱动的文档.听名字有点抽象,说简单一点,其实就是一个 JavaScript 的函数库,使用它主要是用来做数据可视化的.如果你不知道什么是 JavaScript ,请先学习一下 JavaScript,推荐阮一峰老师的教程. JavaScript 文件的后缀名通常为 .js,故 D3 也常使用 D3.js 称呼.D3 提供了各种简单易用的函数,大大简化了 JavaScript 操作数据的难度.由于

  • 基于java Files类和Paths类的用法(详解)

    Java7中文件IO发生了很大的变化,专门引入了很多新的类: import java.nio.file.DirectoryStream; import java.nio.file.FileSystem; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.

  • 基于python批量处理dat文件及科学计算方法详解

    摘要:主要介绍一些python的文件读取功能,文件内容修改,文件名后缀更改等操作. 批处理文件功能 import os path1 = 'C:\\Users\\awake_ljw\\Documents\\python for data analysis\\test1' path2 = 'C:\\Users\\awake_ljw\\Documents\\python for data analysis\\test2' filelist = os.listdir(path1) for files i

  • 基于vue-cli3多页面开发apicloud应用的教程详解第1/2页

    之前开发项APP项目直接用APICloud+原生js的方式进行编写,整个项目下来发现开发慢,页面代码多且复杂,维护起来相对困难,而且文件大打包之后的APP会比较大,apicloud的框架也不好用,支持部分es67(像let.const.import等es6新特性不支持写的太难受了) 采用vue-cli+APIcloud的方式写解决以上痛点,开发灵活,并且打包之后体积更小速度更快 环境依赖 vue webpack vue-cli3 nodeJS 基本流程 项目开发最好准备两个项目,一个打包APP,

  • 基于Python中isfile函数和isdir函数使用详解

    Python编程语言判断是否是目录 在Python编程语言中可以使用os.path.isdir()函数判断某一路径是否为目录.其函数原型如下所示. os.path.isdir(path) 参数含义如下. path:要进行判断的路径.以下实例判断E:\MJlife\test是否为目录. >>>import os >>>os.path.isdir('E:\\MJlife\\test') 判断是否为目录的输出结果 True 表示H:\MJlife\test是目录. Pytho

  • 基于Pytorch版yolov5的滑块验证码破解思路详解

    前言 本文将使用pytorch框架的目标识别技术实现滑块验证码的破解.我们这里选择了yolov5算法 例:输入图像 输出图像 可以看到经过检测之后,我们能很准确的定位到缺口的位置,并且能得到缺口的坐标,这样一来我们就能很轻松的实现滑动验证码的破解. 一.前期工作 yolov系列是常用的目标检测算法,yolov5不仅配置简单,而且在速度上也有不小的提升,我们很容易就能训练我们自己的数据集. YOLOV5 Pytorch版本GIthub网址感谢这位作者的代码. 下载之后,是这样的格式 ---data

  • 基于DOM节点删除之empty和remove的区别(详解)

    要移除页面上节点是开发者常见的操作,jQuery提供了几种不同的方法用来处理这个问题,这里我们开仔细了解下empty和remove方法 empty 顾名思义,清空方法,但是与删除又有点不一样,因为它只移除了 指定元素中的所有子节点. 这个方法不仅移除子元素(和其他后代元素),同样移除元素里的文本.因为,根据说明,元素里任何文本字符串都被看做是该元素的子节点.请看下面的HTML: <div class="hello"><p>这是p标签</p></

随机推荐