在 Windows 有一些字符是不能作为文件名,尝试重命名一个文件,例如输入英文的/
就可以看到 Windows 提示的不能作为文件名的字符:
那么具体是包括哪些符号不能作为文件名,这些字符不能用来文件名和文件夹名。
Name | Symbol |
---|---|
Tilde | ~ |
Number sign | # |
Percent | % |
Ampersand | & |
Asterisk | * |
Braces | { } |
Backslash | \ |
Colon | : |
Angle brackets | <> |
Question mark | ? |
Slash | / |
Plus sign | + |
Pipe | | |
Quotation mark | ‘’ |
微软提供了 System.IO.Path.GetInvalidFileNameChars
来获取所有非法字符,下面的代码可以直接用于将非法字符替换为任意字符:
/**
* @param text: 原始串
* @param replacement: 要替换的字符串
*/
public static string MakeValidFileName(string text, string replacement = "_")
{
StringBuilder str=new StringBuilder();
var invalidFileNameChars = System.IO.Path.GetInvalidFileNameChars();
foreach (var c in text)
{
if (invalidFileNameChars.Contains(c))
{
str.Append(replacement??"");
}
else
{
str.Append(c);
}
}
return str.ToString();
}
如果你仍然要显示非法字符,可以使用下面的代码:
public static string GetSafeFilename(string arbitraryString)
{
var invalidChars = System.IO.Path.GetInvalidFileNameChars();
var replaceIndex = arbitraryString.IndexOfAny(invalidChars, 0);
if (replaceIndex == -1) return arbitraryString;
var r = new StringBuilder();
var i = 0;
do
{
r.Append(arbitraryString, i, replaceIndex - i);
switch (arbitraryString[replaceIndex])
{
case '"':
r.Append("''");
break;
case '<':
r.Append('\u02c2'); // '˂' (modifier letter left arrowhead)
break;
case '>':
r.Append('\u02c3'); // '˃' (modifier letter right arrowhead)
break;
case '|':
r.Append('\u2223'); // '∣' (divides)
break;
case ':':
r.Append('-');
break;
case '*':
r.Append('\u2217'); // '∗' (asterisk operator)
break;
case '\\':
case '/':
r.Append('\u2044'); // '⁄' (fraction slash)
break;
case '\0':
case '\f':
case '?':
break;
case '\t':
case '\n':
case '\r':
case '\v':
r.Append(' ');
break;
default:
r.Append('_');
break;
}
i = replaceIndex + 1;
replaceIndex = arbitraryString.IndexOfAny(invalidChars, i);
} while (replaceIndex != -1);
r.Append(arbitraryString, i, arbitraryString.Length - i);
return r.ToString();
}