如何在Windows下检查给定的字符串是否为合法/有效的文件名?
我想在我的应用程序中包含批处理文件重命名功能。 用户可以键入一个目标文件名模式,并且(在替换模式中的某些通配符之后),我需要检查它是否将成为Windows下的合法文件名。 我试过使用像[a-zA-Z0-9_]+
这样的正则表达式,但它不包含来自各种语言的许多国家特定字符(例如元音变音等)。 做这种检查的最佳方法是什么?
您可以从Path.GetInvalidPathChars
和GetInvalidFileNameChars
获取无效字符的列表。
UPD:请参阅Steve Cooper关于如何在正则表达式中使用这些内容的建议。
UPD2:请注意,根据MSDN中的注释部分“从此方法返回的数组不能保证包含文件和目录名称中无效的完整字符集。” 由六个字母的可能性提供的答案更详细。
从MSDN的“命名文件或目录”,这里是Windows下合法文件名称的常规约定:
您可以在当前代码页(Unicode / ANSI 127以上)中使用任何字符,但以下情况除外:
<
>
:
"
/
|
?
*
一些可选的事情要检查:
?
前缀) ?
时,Unicode文件路径(包括文件名)的长度超过32,000个字符(请注意,前缀可能会扩展目录组件,并导致它超出32,000的限制) 对于3.5之前的.Net框架,这应该起作用:
正则表达式匹配应该可以帮助你。 这是一个使用System.IO.Path.InvalidPathChars
常量的片段;
bool IsValidFilename(string testName)
{
Regex containsABadCharacter = new Regex("["
+ Regex.Escape(System.IO.Path.InvalidPathChars) + "]");
if (containsABadCharacter.IsMatch(testName)) { return false; };
// other checks for UNC, drive-path format, etc
return true;
}
对于3.0以后的.Net Frameworks,这应该可以工作:
http://msdn.microsoft.com/en-us/library/system.io.path.getinvalidpathchars(v=vs.90).aspx
正则表达式匹配应该可以帮助你。 这是一个使用System.IO.Path.GetInvalidPathChars()
常量的片段;
bool IsValidFilename(string testName)
{
Regex containsABadCharacter = new Regex("["
+ Regex.Escape(new string(System.IO.Path.GetInvalidPathChars())) + "]");
if (containsABadCharacter.IsMatch(testName)) { return false; };
// other checks for UNC, drive-path format, etc
return true;
}
一旦你知道了,你还应该检查不同的格式,例如c:mydrive
和serversharedirfile.ext
上一篇: How do I check if a given string is a legal/valid file name under Windows?