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 的原因了。

The answer is to use the System.Uri-constructor to combine the URL:

public static Uri CombineUri(string baseUri, string relativeOrAbsoluteUri) {
return new Uri(new Uri(baseUri), relativeOrAbsoluteUri);
} public static string CombineUriToString(string baseUri, string relativeOrAbsoluteUri) {
return new Uri(new Uri(baseUri), relativeOrAbsoluteUri).ToString();
} .. // Results in "http://www.my.domain/relative/path"
var a = CombineUriToString("http://www.my.domain/", "relative/path"); // Results in "http://www.my.domain/absolute/path"
var b = CombineUriToString("http://www.my.domain/something/other", "/absolute/path");

C# Path.Combine 缺陷(http路径用Uri类)的更多相关文章

  1. C# Path 有关于文件路径等问题类(转)

    C# Path 标签:C#, Path C-Sharp  0 Path handles file path processing. The .NET Framework provides effect ...

  2. 关于程序路径Path.Combine以及AppDomain.CurrentDomain.BaseDirectory

    关于程序路径 LucenePath:@(System.Configuration.ConfigurationManager.AppSettings["LucenePath"])&l ...

  3. Path.Combine 合并两个路径字符串,会出现的问题

    Path.Combine(path1,path2) 1.如果path2字符串,以 \ 或 / 开头,则直接返回 path2

  4. C# Path.Combine 方法的用法

    C#   Path.Combine 方法的用法 *.注意: string filePath3= Path.Combine(string path1,string path2): 情况一: path2中 ...

  5. 基于用Path.Combine的优化

    Path.Combine: 什么时候会用到Path.Combine呢?,当然是连接路径字符串的时候! 所以下面的代码可以完美的工作: public static void Main() { strin ...

  6. 使用System.IO.Combine(string path1, string path2, string path3)四个参数的重载函数提示`System.IO.Path.Combine(string, string, string, string)' is inaccessible due to its protection level

    今天用Unity5.5.1开发提取Assets目录的模块,使用时采用System.IO.Path.Combine(string, string, string, string)函数进行路径生成 明明是 ...

  7. c# Path.Combine

    Path.Combine: c#获取当前项目路径 : //获取包含当前执行的代码的程序集的加载文件的完整路径 var appPath = System.IO.Path.GetDirectoryName ...

  8. Path.Combine Method

    https://docs.microsoft.com/en-us/dotnet/api/system.io.path.combine?view=netframework-4.8#System_IO_P ...

  9. Path.Combine(

    // 获取程序的基目录. var dir1 = System.AppDomain.CurrentDomain.BaseDirectory; // 获取模块的完整路径. var dir2 = Syste ...

随机推荐

  1. ValueError: Only call `softmax_cross_entropy_with_logits` with named arguments (labels=..., logits=..., ...)

    tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=predicton,labels=y))

  2. 高并发下的Nginx优化

    高并发下的Nginx优化 2014-08-08 13:30 mood Nginx    过去谈过一些关于Nginx的常见问题; 其中有一些是关于如何优化Nginx. 很多Nginx新用户是从Apach ...

  3. Java-Dom4jHelper工具类

    import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import ja ...

  4. buuctf@ciscn_2019_n_1

    from pwn import * #io=process('./ciscn_2019_n_1') io=remote('node3.buuoj.cn',28216) io.sendline(0x38 ...

  5. haproxy和keepalived的理解(转载)

    关于此两者,随便google一下都会有大量的文章,因此这里也不用介绍如何来进行安装和配置了.主要从一个整体方案的角度来描述什么要这样做,以及这样做所解决的问题. 所有的系统,都是先经历一个单台机器搞所 ...

  6. MySQL的btree索引和hash索引区别

     在使用MySQL索引的时候, 选择b-tree还是hash hash索引仅仅能满足"=","IN"和"<=>"查询,不能使用范 ...

  7. 读狼书,重温flask

    最近做个简单的MIS系统, 趁机读<flask web 开发实战 入门.进阶与原理解析> 李辉.  由于是flask官方团队的人写的.方方面面都很细致. 很多写法.配置,和之前0.X时代也 ...

  8. 『HGOI 20190917』Lefkaritika 题解 (DP)

    题目概述 一个$n \times m$的整点集.其中$q$个点被m被设置为不能访问. 问这个点集中含有多少个不同的正方形,满足不包含任何一个不能访问的点. 对于$50\%$的数据满足$1 \leq n ...

  9. 2019牛客暑期多校训练营(第一场)I dp+线段树

    题意 给出n个点,每个点有a,b两个属性,让你从左下角到右上角划一条线,线的左边每个点的贡献是\(a_i\),线的右边每个点的贡献是\(b_i\),使得两部分的总和最大. 分析 找一条折线将点分割开, ...

  10. ssh链接取消密码

    进入到存放秘钥的文件夹,输入 ssh-add id_rsa 然后输入两次密码即可.