C#中用于文件名验证的正则表达式

时间:2020-03-06 14:24:53  来源:igfitidea点击:

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

我想像下面这样使用它:

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

解决方案

为什么不使用System.IO.FileInfo类以及DirectoryInfo类,则具有一组有用的方法。

正如已经回答的那样,GetInvalidFileNameChars应该为我们完成此操作,并且我们甚至不需要正则表达式的开销:

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

这并不像仅检查文件名是否包含System.IO.Path.GetInvalidFileNameChars(已经在其他几个答案中提到)那样简单。

例如,如果有人输入的名称不包含无效字符,但长度为300个字符(即大于MAX_PATH),则该方法不适用于任何.NET文件API,并且仅在其余的Windows窗口中使用\?\路径语法。我们需要有关路径的其余部分有多长的上下文,以确定文件名可以有多长时间。我们可以在此处找到有关此类事物的更多信息。

最终,我们所有可以做的可靠检查就是证明文件名无效,或者为我们合理估计文件名是否有效。如果不实际尝试使用文件名,几乎不可能证明该文件名是有效的。 (即使那样,我们仍然会遇到诸如已存在的问题?它可能是有效的文件名,但是在方案中使用重复的名称是否有效?)

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

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