c# Path.Combine


Path.Combine:

c#獲取當前項目路徑 :

 1 //獲取包含當前執行的代碼的程序集的加載文件的完整路徑
 2             var appPath = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
 3             Console.WriteLine(appPath);
 4 
 5             //獲取模塊的完整路徑
 6             string path = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
 7             Console.WriteLine(path);
 8 
 9             //獲取和設置當前目錄(該進程從中啟動的目錄)的完全限定目錄。
10             var dicPath = System.Environment.CurrentDirectory;
11             Console.WriteLine(dicPath);
12 
13             //獲取程序的基目錄
14             string basePath = System.AppDomain.CurrentDomain.BaseDirectory;
15             Console.WriteLine(basePath);
16 
17             //獲取和設置包括該應用程序的目錄的名稱
18             string domainPath = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
19             Console.WriteLine(domainPath);

輸出結果:

 

 

 

System.IO.Path.Combine 簡單來說,就是合並兩個及兩個以上的路徑字符串。

 

 1             //兩個都是絕對路徑,返回后者
 2             string tmp = Path.Combine(@"C:\user", @"D:\test.txt");
 3             Console.WriteLine(tmp);
 4             //如果指定的路徑之一是零長度字符串,則該方法返回其他路徑。
 5             //當然,兩個都是零長度字符串,則返回的就是 string.Empty ;
 6             string tmp1 = Path.Combine("", @"D:\test.txt");
 7             Console.WriteLine(tmp1);
 8             string tmp2 = Path.Combine(@"C:\user", "");
 9             Console.WriteLine(tmp2);
10             //如果其中一個參數為 null ,會拋出異常(System.ArgumentNullException)
11             string tmp3 = Path.Combine(@"C:\user", null);
12             Console.WriteLine(tmp3);

 

輸出結果:

 

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

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));

        }

    }

}

結果如下:

 

 

從這個例子可以知道,我們不需要考慮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 string Combine(string path1, string path2);

public static string Combine(string path1, string path2, string path3);

public static string Combine(string path1, string path2, string path3, string path4);

其中第二個后面的所有參數都不能帶有 “/” 符號的路徑,否則還是會返回最后一個能組成的相對路徑的。

 

1  string[] arr_pa = { @"c:\abc\", @"c:\abc" };
2             string[] arr_pb = { @"\test.txt", @"/test.txt", @"test.txt" };
3             foreach (string pa in arr_pa)
4             {
5                 foreach (string pb in arr_pb)
6                 {
7                     Console.WriteLine("'{0}' + '{1}'= '{2}'", pa, pb, Path.Combine(pa,"/users", pb));
8                 }
9             }

 

輸出如下:

 

如果需要支持路徑的話。那么需要自己擴展一下該方法即可。。

 1 public static string CombinePath(this string path1, string path2)
 2 {
 3 if (string.IsNullOrEmpty(path2))
 4 return path1;
 5 var paths = path2.Split(new char[] { '\\', '/' });
 6 foreach (var item in paths.Select(s => s.Trim()).Where(s =>!string.IsNullOrEmpty( s)))
 7 {
 8 path1 = System.IO.Path.Combine(path1, item);
 9 }
10 return path1;
11 }

輸出結果:

 

 

但是還是不能解決Url地址的問題

正是因為上述的幾點不足,導致Path.Combine 很難用,這也是有一部分人選擇使用String.Format 的原因了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM