【问题标题】:Exact file extension match with GetFiles()?与 GetFiles() 完全匹配的文件扩展名?
【发布时间】:2011-07-31 04:37:09
【问题描述】:

我想检索扩展名与指定字符串完全匹配的文件列表。

DirectoryInfo di = new DirectoryInfo(someValidPath);
List<FileInfo> myFiles = new List<FileInfo>();
foreach (FileInfo fi in di.GetFiles("*.txt"))
{
    myFiles.Add(fi);
}

我得到了扩展名为*.txt 的文件,但我也得到了扩展名为*.txtx 的文件,所以我编写的代码相当于获取扩展名 txt 开头的文件。

这不是我想要的。我是否需要获取所有文件名并对"\\.txt$" 进行正则表达式匹配(我认为),或者使用.EndsWith(".txt") 等测试每个文件名字符串来完成此操作?

谢谢!

【问题讨论】:

  • 是的,你知道。有那么难吗,为什么需要正则表达式?
  • 当心,每个的答案都忘记了 Windows 文件名不区分大小写。您也可以获得 .TXT。文件名的大小写规则有点讨厌,您可能需要检查字符串长度。
  • @Hans:好点。 Fredrik 的回答是否处理不区分大小写的问题?
  • 呃,这样更好。正如我所说,令人讨厌的是,文件系统保留了自己的大小写规则。如果只是 .txt,Fredrik 的代码就可以工作

标签: c# regex filtering getfiles


【解决方案1】:

有点解决方法,但您可以使用 Where 扩展方法过滤掉完全匹配:

foreach (FileInfo fi in di.GetFiles("*.txt")
    .Where(fi => string.Compare(".txt", fi.Extension, StringComparison.OrdinalIgnoreCase) == 0))
{
   myFiles.Add(fi);
}

请注意,这将使扩展名不区分大小写。

【讨论】:

    【解决方案2】:

    使用列表的 AddRange 功能,而不是执行 foreach 循环并为以下表达式返回的每个项目调用 Add(我将其保存到变量列表中)。

    var list = di.GetFiles("*.txt").Where(f => f.Extension == ".txt");
    myFiles.AddRange(list);
    

    我假设您只是向我们展示了您的代码的 sn-p 并且 myFiles 中已经有值,如果没有,您可以这样做。

    List<FileInfo> myFiles = di.GetFiles("*.txt").Where(f => f.Extension == ".txt").ToList();
    

    【讨论】:

    • 已编辑并提供了更多示例。
    【解决方案3】:

    正则表达式可能有点矫枉过正。使用 FileInfo 上的扩展名。

    foreach (FileInfo fi in di.GetFiles("*.txt").Where(f => f.Extension == ".txt"))
    {
         myFiles.Add(fi);
    } 
    

    【讨论】:

    • 代替foreach循环,你可以做myFiles.AddRange( the expression )
    • @Chuck Savage:“表达式”是foreach 循环中in 之后的部分吗?
    【解决方案4】:

    试试这个:

    DirectoryInfo di = new DirectoryInfo(someValidPath); 
    List<FileInfo> myFiles =  
        (
            from file in di.GetFiles("*.txt")
            where file.Extension == ".txt"
            select file
        ).ToList();
    

    【讨论】:

      【解决方案5】:
      DirectoryInfo di = new DirectoryInfo(someValidPath);
      List<FileInfo> myFiles = new List<FileInfo>();
      foreach (FileInfo fi in di.GetFiles("*.txt"))
      {
         if (fi.Extension == ".txt")
            myFiles.Add(fi);
      }
      

      【讨论】:

        【解决方案6】:

        您不能添加一个 if 并检查文件名的最后四个字符吗?

        【讨论】:

          【解决方案7】:

          如果您使用的是 C# 2.0 不是更容易吗?

          string fileExtensionFilter = "*.txt";
                      DirectoryInfo di = new DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));
                      List<FileInfo> myFiles = new List<FileInfo>();
                      foreach (FileInfo fi in di.GetFiles(fileExtensionFilter))
                      {
                          if (fi.Extension == fileExtensionFilter.Substring(1)) myFiles.Add(fi);
                      }
          

          【讨论】:

            【解决方案8】:

            我有一个用户提供的模式,所以许多其他答案都不适合我。我最终得到了这个更通用的解决方案:

            public string[] GetFiles(string path, string pattern)
            {
                bool lastWildIsHook = false;
                if(pattern.EndsWith("?"))
                {
                    pattern = pattern.Substring(0, pattern.Length - 1);
                    lastWildIsHook = true;
                }
                var lastWildIndex = Math.Max(pattern.LastIndexOf("*"), pattern.LastIndexOf("?"));
                var endsWith = pattern.Length > lastWildIndex ? pattern.Substring(lastWildIndex + 1) : pattern;
                if(!lastWildIsHook)
                    return Directory.GetFiles(path, pattern).Where(p => p.EndsWith(endsWith)).ToArray();
                else
                    return Directory.GetFiles(path, pattern).Where(p => p.EndsWith(endsWith) || p.Substring(0, p.Length - 1).EndsWith(endsWith)).ToArray();
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多