2012-06-05 36 views
12

我正在研究一個程序,該程序根據列標題讀取文件並保存它們的一部分。其中一些標題具有非法字符的文件名,所以我寫了這段代碼來處理這些問題。C#string.replace刪除非法字符

string headerfile = saveDir + "\\" + tVS.Nodes[r].Text.Replace("\"", "").Replace 
       ("/","").Replace(":"," -").Replace(">","(Greater Than)") + ".csv"; 

有沒有更好的方式做到這一點,我沒有4 .Replace()?或者是否有某種內置於我不知道的非法角色卸妝?

謝謝!

編輯:它不需要用任何特定的東西來替換字符。空白就足夠了。

+1

如果你只是刪除非法字符,你可以簡化它很多,但鑑於你用其他東西替換了大部分,你限制了很多選項。 – Servy

+0

我不需要稱它們爲特定的東西,它可能只是一個空白的「」。 – Axxelsian

回答

33

正則表達式通常是這樣做的好方法,但不是當你與不同的東西替換每個字符。你可能會考慮用同樣的東西替換它們,只是使用System.IO.Path.GetInvalidFileNameChars()

string filename = tVS.Nodes[r].Text; 

foreach(char c in System.IO.Path.GetInvalidFileNameChars()) { 
    filename = filename.Replace(c, '_'); 
} 
+0

問題在於,如果文件具有更多連續的無效字符,則會插入多個連續的「_」,例如將文件「my \\\ file \\\\\\\\\ name」插入到「my___file__________name」 。這很好,但更好的解決方案是將它最終作爲「my_file_name」。 – pixel

2

看看Regex.Replace here,它會做你想要的每一個單獨剝離字符的一切。其他字符串的選擇性替換可能會更棘手。

8

System.IO.Path. GetInvalidFileNameChars()具有所有無效字符。

這裏有一個樣品的方法:

public static string SanitizeFileName(string fileName, char replacementChar = '_') 
{ 
    var blackList = new HashSet<char>(System.IO.Path.GetInvalidFileNameChars()); 
    var output = fileName.ToCharArray(); 
    for (int i = 0, ln = output.Length; i < ln; i++) 
    { 
     if (blackList.Contains(output[i])) 
     { 
      output[i] = replacementChar; 
     } 
    } 
    return new String(output); 
} 
2
string charsToRemove = @"\/:";TODO complete this list 

string filename; 

string pattern = string.format("[{0}]", Regex.Escape(charsToRemove)); 
Regex.Replace(filename, pattern, ""); 

如果你只是想刪除非法字符,而不是替代的東西在別的你可以用這個。

+0

它不適用於很多人。在最後一行中,您應該將Regex修改後的值賦給某個​​字符串變量,即'filename = Regex.Replace(filename,pattern,「」);'' –