【问题标题】:How to check for illegal file/folder names in c#如何在 C# 中检查非法文件/文件夹名称
【发布时间】:2020-12-03 00:43:59
【问题描述】:

我正在制作一个小程序,它将自动生成创建网站所需的所有文件,例如 index.htmlstyle.css,因此当我创建新网站时,开始编码会很容易。我想让我的程序在文本框中不接受任何非法文件/文件夹名称和字符。我只是不想要<>:/|\?*,但我也希望connul 这样的名字不起作用。

我在 Visual Studio 2019 和 dotnet 3 中使用 c# winforms

如果有人有答案请告诉我。

【问题讨论】:

  • 这能回答你的问题吗? How to remove illegal characters from path and filenames?。您必须自行检查以删除connul,因为它们可能是合法文件名的一部分(例如consolidations.txtnullvaluesfromtable.txt)。
  • that will auto generate all of the files 如果您是自动生成的,请随意调用它们。

标签: c# visual-studio winforms io filenames


【解决方案1】:

文件名中不允许使用的字符可通过Path.GetInvalidFileNameChars() 方法获得(但请注意文档中的“备注”部分)。对于reserved file names,我不知道获取它们的方法,因此您必须明确地与它们进行比较:

bool IsValidFileName(string name)
{
    // empty names are not allowed
    if (string.IsNullOrEmpty(name))
        return false;
    
    // check for characters that are not allowed in a file name
    if (Path.GetInvalidFileNameChars().Any(c => name.Contains(c))
        return false;
    
    // check for reserved names
    if (name.Equals(".", StringComparison.OrdinalIgnoreCase)
        || name.Equals("..", StringComparison.OrdinalIgnoreCase)
        || name.Equals("CON", StringComparison.OrdinalIgnoreCase)
        || name.Equals("PRN", StringComparison.OrdinalIgnoreCase)
        || name.Equals("AUX", StringComparison.OrdinalIgnoreCase)
        || name.Equals("NUL", StringComparison.OrdinalIgnoreCase)
        || name.Equals("COM1", StringComparison.OrdinalIgnoreCase)
        || name.Equals("COM2", StringComparison.OrdinalIgnoreCase)
        || name.Equals("COM3", StringComparison.OrdinalIgnoreCase)
        || name.Equals("COM4", StringComparison.OrdinalIgnoreCase)
        || name.Equals("COM5", StringComparison.OrdinalIgnoreCase)
        || name.Equals("COM6", StringComparison.OrdinalIgnoreCase)
        || name.Equals("COM7", StringComparison.OrdinalIgnoreCase)
        || name.Equals("COM8", StringComparison.OrdinalIgnoreCase)
        || name.Equals("COM9", StringComparison.OrdinalIgnoreCase)
        || name.Equals("LPT1", StringComparison.OrdinalIgnoreCase)
        || name.Equals("LPT2", StringComparison.OrdinalIgnoreCase)
        || name.Equals("LPT3", StringComparison.OrdinalIgnoreCase)
        || name.Equals("LPT4", StringComparison.OrdinalIgnoreCase)
        || name.Equals("LPT5", StringComparison.OrdinalIgnoreCase)
        || name.Equals("LPT6", StringComparison.OrdinalIgnoreCase)
        || name.Equals("LPT7", StringComparison.OrdinalIgnoreCase)
        || name.Equals("LPT8", StringComparison.OrdinalIgnoreCase)
        || name.Equals("LPT9", StringComparison.OrdinalIgnoreCase))
        return false;
        
    return true;
}

查看路径名,可以使用类似的Path.GetInvalidPathChars()方法:

bool IsValidPathName(string name)
{
    // empty path is not allowed
    if (string.IsNullOrEmpty(name))
        return false;
    
    // check for characters that are not allowed in a path name
    if (Path.GetInvalidPathChars().Any(c => name.Contains(c))
        return false;
    
    // check the file name part
    if (!IsValidFileName(Path.GetFileName(name))
        return false;
        
    return true;
}

【讨论】:

    【解决方案2】:

    我只是不想要 :/|?*

    为此,您可以尝试使用正则表达式来排除它们。

    // if contains the characters, return true
    bool containsChar = Regex.IsMatch(textBox1.Text, @"[<>:/|\\?*]");
    

    但我也希望 con 和 nul 等名称不起作用

    您想排除connul 作为文件名,还是不允许在字符串中包含这些子字符串?如果是后者,可以参考下面的代码。

    // array to store excluded substring
    string[] excludesubstring = { "con", "nul" };
    bool containsSubstr = false;
    
    foreach (string str in excludesubstring)
    {
        if (containsSubstr = textBox1.Text.Contains(str) == true)
            break;
    }
    

    最后,使用以下命令检查它是否是一个有效的文件名。

    if (containsChar || containsSubstr)
    {
        Console.WriteLine("filename includes invalid content");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-23
      • 1970-01-01
      • 1970-01-01
      • 2015-06-03
      • 2011-07-12
      相关资源
      最近更新 更多