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