13

我正在开发一个程序,该程序可以读取文件并根据其列的标题保存其中的一部分。其中一些标题的文件名包含非法字符,因此我编写了这段代码来处理这些问题。

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

在我没有 4 的情况下有更好的方法.Replace()吗?还是有某种我不知道的内置非法字符去除器?

谢谢!

编辑:它不需要用任何特定的字符替换字符。一个空格就足够了。

4

4 回答 4

37

正则表达式通常是一个很好的方法,但当你用不同的东西替换每个字符时就不行了。您可能会考虑将它们全部替换为相同的东西,并且只使用System.IO.Path.GetInvalidFileNameChars().

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

foreach(char c in System.IO.Path.GetInvalidFileNameChars()) {
    filename = filename.Replace(c, '_');
}
于 2012-06-05T13:40:52.047 回答
9

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);
}
于 2012-06-05T13:39:49.067 回答
2

看看 Regex.Replace在这里,当涉及到单独剥离字符时,它会做你想做的一切。选择性地替换其他字符串可能更棘手。

于 2012-06-05T13:38:20.357 回答
2
string charsToRemove = @"\/:";TODO complete this list

string filename;

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

如果您只想删除非法字符,而不是用其他东西替换它们,您可以使用它。

于 2012-06-05T13:41:30.773 回答