2009-06-26 80 views
49

將路徑與文件名合併的最佳方式是什麼?我想要c:\foo\bar.txt在C#/ .NET中合併路徑和文件名的最佳方式是什麼?

鑑於c:\foo..\bar.txt,我想有錯誤或者c:\foo\bar.txt(所以我不能使用Path.Combine()直接)。同樣,對於c:\foobar/baz.txt,我想要一個錯誤或c:\foo\baz.txt(而不是c:\foo\bar\baz.txt)。

我意識到,我可以檢查文件名不包含'\'或'/',但是這足夠嗎?如果不是,那麼正確的支票是什麼?

回答

83

如果你想 「壞」 的文件名生成一個錯誤:

if (Path.GetFileName(fileName) != fileName) 
{ 
    throw new Exception("'fileName' is invalid!"); 
} 
string combined = Path.Combine(dir, fileName); 

或者,如果你只是想靜靜地糾正「壞」文件名而不拋出前ception:

string combined = Path.Combine(dir, Path.GetFileName(fileName)); 
+9

對於那些不太熟悉框架的人,您需要在文件中使用「System.IO」調用來訪問「Path」。 – 2012-09-07 13:41:47

+2

請注意,如果Path.Combine中的任何一個參數都爲null,它將拋出一個`ArgumentNullException`。您**可以**將空字符串傳遞給參數 – 2013-03-01 23:23:19

16

你可以使用:

Path.Combine(folder, Path.GetFileName(fileName)) 

,或者跳過了\(未測試,也許Path.GetFileName會自動處理)

Path.Combine(folder, Path.GetFileName(fileName.Replace("/","\\"))) 
+4

謝謝!只是供參考:替換是沒有必要的。 – 2009-06-26 10:01:24

1

要知道,當你使用Path.Combine(arg1, arg2) - 如果您的用戶對ARG2輸入一個完全合格的文件路徑,它將不顧ARG1,並使用ARG2爲路徑。

在我看來,微軟搞砸了!這可能會讓用戶在整個文件系統中進行黑客攻擊。被警告,請仔細閱讀!如果你合併路徑使用:var newPath = path1 + @"\" + path2;更簡單,沒有意外的結果...

相關問題