最近有一个需求,就是批量建立文件夹,文件夹的名称不是固定的,有可能是任意的字符。程序执行过程偶尔会出现报错,大概就是说文件夹名称中包含了非法的的字符,因此整理下Windows下文件和文件夹名称的命名规范。
Windows系统不能含有以下9种字符,另外不能以空格开头,文件名或文件夹名可以由1~256个西文字符或128个汉字(包括空格)组成,不能多于256个字符。
- 星号 (*)
- 竖线 (|)
- 反斜杠 (\)
- 冒号 (:)
- 双引号 (“)
- 小于号 (<)
- 大于号 (>)
- 问号 (?)
- 正斜杠 (/)
这些主要是因为它们是在 DOS 时代有着特殊意义的一些字符,有的现在依然很常用。
/和\是路径分隔符,所以不能用作文件名以免产生是路径还是文件的歧义,
DOS下的文件路径格式是这样的,
C:\Progra~1\abc\
所以根据避免歧义的原则,冒号也不能作为文件名。
还有*和?,这两个叫做“通配符”,分别用来代替任意多个字符和单个字符。
其他的我知道在 linux 下有特殊含义比如数据流重定向 <>。|是管道。所以文件名出线这些字符在输入命令的时候会出线歧义。
以上都是指在输入法在英文状态下即半角状态的字符,中文字符没有这些限制。
这边我利用 .NETFramework 自带的方法过滤这些非法字符:
方法一:
string strFileName = "\"I\"\\n/va/l**id:>> file\\/:*?\"| il*e|n|| a\"me.?\t\r"; string strInvalid = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars()); foreach (char c in strInvalid) { strFileName = strFileName.Replace(c.ToString(), ""); } Console.WriteLine(strFileName);
第二种方法是使用正则表达式:
string strFileName = "\"I\"\\n/va/l**id:>> file\\/:*?\"| il*e|n|| a\"me.?\t\r"; string regexSearch = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars()); Regex reg = new Regex(string.Format("[{0}]", Regex.Escape(regexSearch))); strFileName = reg.Replace(strFileName, ""); Console.WriteLine(strFileName);