我正在开发一个程序,该程序读取文件并根据其专栏标题保存其中的各个部分。其中一些标题的文件名包含非法字符,因此我编写了这段代码来处理这些问题。
string headerfile = saveDir + "\\" + tVS.Nodes[r].Text.Replace("\"", "").Replace
("/","").Replace(":"," -").Replace(">","(Greater Than)") + ".csv";
如果我没有 4 个
.Replace()
,有没有更好的方法可以做到这一点?或者是否有某种我不知道的内置非法字符删除器?
谢谢!
编辑:它不需要用任何特定的内容替换字符。空格就足够了。
正则表达式通常是一个很好的方法,但当你用不同的东西替换每个字符时就不行了。您可能会考虑用相同的东西替换它们,并且只使用
System.IO.Path.GetInvalidFileNameChars()
。
string filename = tVS.Nodes[r].Text;
foreach(char c in System.IO.Path.GetInvalidFileNameChars()) {
filename = filename.Replace(c, '_');
}
System.IO.Path.GetInvalidFileNameChars()
包含所有无效字符。
这是一个示例方法:
public static string SanitizeFileName
(
string fileName,
char replacementChar = '_'
)
{
HashSet<char> blackList = new(System.IO.Path.GetInvalidFileNameChars());
char[] 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);
}
如果您想将连续的无效字符压缩为单个替换字符,您可能需要这样的东西:
public static string SanitizeFileNameAndCondense
(
string fileName,
char replacementChar = '_'
)
{
HashSet<char> blackList = new(System.IO.Path.GetInvalidFileNameChars());
char[] output = fileName.ToCharArray();
bool replaced = false;
int i = 0, x = 0, ln = output.Length;
for (; i < ln; i++)
{
if (blackList.Contains(output[i]))
{
if (!replaced)
{
output[x++] = replacementChar;
}
replaced = true;
}
else
{
output[x++] = output[i];
replaced = false;
}
}
return new String(output, 0, x);
}
看看 Regex.Replace here,它会在单独删除字符时完成您想要的一切。选择性替换其他字符串可能会更棘手。
string charsToRemove = @"\/:";TODO complete this list
string filename;
string pattern = string.format("[{0}]", Regex.Escape(charsToRemove));
Regex.Replace(filename, pattern, "");
如果你只是想删除非法字符,而不是用其他字符替换它们,你可以使用这个。