在 Windows 有一些字元是不能作為文件名,嘗試重命名一個文件,輸入`/` 就可以看到windows 提示的不能作為文件名的字元 ...
在 Windows 有一些字元是不能作為文件名,嘗試重命名一個文件,輸入/
就可以看到windows 提示的不能作為文件名的字元
那麼具體是包括哪些符號不能作為文件名?
- Tilde (
~
) - Number sign (
#
) - Percent (
%
) - Ampersand (
&
) - Asterisk (
*
) - Braces (
{
}
) - Backslash (\)
- Colon (
:
) - Angle brackets (
<
>
) - Question mark (
?
) - Slash (
/
) - Plus sign (
+
) - Pipe (
|
) - Quotation mark (
"
)
上面這些字元不能用來文件名和文件夾名
而且在 windows 的要求,文件是需要有文件名的,雖然你也可以創建.file
這樣的文件,但是用戶是難以自己輸入這樣的文件名。
之外還有一些文件名是保留,不能創建這樣的文件名
CON, PRN, AUX, CLOCK$, NUL
COM0, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9
LPT0, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9.
嘗試新建一個文本,然後把他文件名命名為上面的任意一個,基本windows會說不能把文件命名
那麼是不是把這些字元串拿出來判斷?實際上微軟已經做了這個了,因為在不同的系統,可能之後會添加新的字元串,所以最好不要自己寫。
可以使用微軟給的函數System.IO.Path.GetInvalidFileNameChars
,下麵的代碼可以直接使用
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();
}
上面的代碼是jnm2 大神寫的
c# - How to make a valid Windows filename from an arbitrary string
我搭建了自己的博客 https://lindexi.gitee.io/ 歡迎大家訪問,裡面有很多新的博客。只有在我看到博客寫成熟之後才會放在csdn或博客園,但是一旦發佈了就不再更新
如果在博客看到有任何不懂的,歡迎交流,我搭建了 dotnet 職業技術學院 歡迎大家加入
本作品採用知識共用署名-非商業性使用-相同方式共用 4.0 國際許可協議進行許可。歡迎轉載、使用、重新發佈,但務必保留文章署名林德熙(包含鏈接:http://blog.csdn.net/lindexi_gd ),不得用於商業目的,基於本文修改後的作品務必以相同的許可發佈。如有任何疑問,請與我聯繫。