文件和文件夹的命名规范

最近有一个需求,就是批量建立文件夹,文件夹的名称不是固定的,有可能是任意的字符。程序执行过程偶尔会出现报错,大概就是说文件夹名称中包含了非法的的字符,因此整理下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);

发表评论

电子邮件地址不会被公开。 必填项已用*标注