代码之家  ›  专栏  ›  技术社区  ›  Game_Overture

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

  •  19
  • Game_Overture  · 技术社区  · 16 年前

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

    我想按如下方式使用它:

    // Return true if string is invalid.
    if (Regex.IsMatch(szFileName, "<your regex string>"))
    {
        // Tell user to reformat their filename.
    }
    
    4 回复  |  直到 15 年前
        1
  •  48
  •   Isak Savo    16 年前

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

    if (proposedFilename.IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) != -1)
    {
      MessageBox.Show("The filename is invalid");
      return;
    }
    
        2
  •  6
  •   Greg Beech    16 年前

    这并不像检查文件名是否包含以下任何内容那么简单 System.IO.Path.GetInvalidFileNameChars (正如其他几个答案中提到的那样)。

    例如,如果有人输入的名称不包含无效字符,但长度为300个字符(即大于MAX_PATH),这将不适用于任何字符。NET文件API,并且仅在使用\?的其余窗口中提供有限的支持\路径语法。您需要了解路径其余部分的长度,以确定文件名的长度。您可以找到 more information about this type of thing here .

    最终,你所有的支票都可以 可靠地 要做的就是证明文件名无效,或者给你一个合理的估计,看看它是否有效。如果不实际尝试使用,几乎不可能证明文件名是有效的。(即使这样,你也会遇到问题,比如如果它已经存在怎么办?它可能是一个有效的文件名,但在你的场景中,有一个重复的名称有效吗?)

        3
  •  0
  •   Drejc    16 年前

    为什么不使用系统。IO.FileInfo类与DirectoryInfo类一起提供了一组有用的方法。

        4
  •  0
  •   Viacheslav Ivanov    16 年前

    路径。GetInvalidFileNameChars-这不是一个好方法。试试这个:

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