2008-09-19 391 views
19

什么是良好的正则表达式,可以验证文本字符串以确保它是有效的Windows文件名? (AKA没有\/:*?"<>|个字符)。C#中用于文件名验证的正则表达式

我想用它类似如下:

// Return true if string is invalid. 
if (Regex.IsMatch(szFileName, "<your regex string>")) 
{ 
    // Tell user to reformat their filename. 
} 

回答

48

前面已经回答了,GetInvalidFileNameChars应该为你做,你甚至不需要正则表达式的开销:

if (proposedFilename.IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) != -1) 
{ 
    MessageBox.Show("The filename is invalid"); 
    return; 
} 
+0

简单的右括弧放置在if语句的事故,但真棒谢谢! – Balk 2008-09-19 06:47:55

+7

那么“C ::::::::”是一个有效的文件名? – Andrew 2010-02-18 20:25:50

0

为什么不使用System.IO.FileInfo类,与你一起拥有一套有用​​的方法DirectoryInfo类。

6

这并不像检查文件名是否包含任何一样简单System.IO.Path.GetInvalidFileNameChars(正如其他一些答案中已经提到的)。

例如,如果某人输入了一个不包含无效字符但长度为300个字符(即大于MAX_PATH)的名称 - 这将不适用于任何.NET文件API,并且只有有限的支持其余的窗口使用\?\路径语法。您需要上下文来确定剩余路径的多长时间来确定文件名可以存在多长时间。你可以找到more information about this type of thing here

最终你所有的支票都可以可靠 do是证明文件名无效,或给你一个合理的估计是否有效。如果没有真正尝试使用它,证明文件名是有效的是几乎不可能的。 (即使你有问题,如果它已经存在?它可能是一个有效的文件名,但它是有效的在您的情况下有一个重复的名称?)

0

Path.GetInvalidFileNameChars - 不是一个好方法。试试这个:

if(@"C:\A.txt".IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) != -1) 
{ 
    MessageBox.Show("The filename is invalid"); 
    return; 
}