【问题标题】:C# Recurse Directories using Directory.GetFiles and search pattern使用 Directory.GetFiles 和搜索模式的 C# 递归目录
【发布时间】:2011-04-01 10:19:23
【问题描述】:

我想使用递归查找目录结构中的所有 excel 文件。问题是,Directory.GetFiles 中使用的搜索模式一次只允许一个扩展名。

是否有人知道解决此问题的方法,或者我是否必须多次遍历目录以查找特定扩展名?或者您可以只抓取每个文件,然后遍历该列表以查找特定的扩展名。无论哪种方式听起来都有些低效。

谢谢

【问题讨论】:

  • 过滤器“.xl*”不够好吗?
  • 你不能只使用“*.xl*”作为搜索模式吗?

标签: c# recursion


【解决方案1】:

.NET 每个版本都有 SearchOption.TopDirectoryOnly 和 SearchOption.AllDirectories

在 .NET 4 中,您可以非常有效地 这样做,例如:

        var regex = new Regex(@"\d+", RegexOptions.Compiled);

        var files = new DirectoryInfo(topdir)

            .EnumerateFiles("*.*", SearchOption.AllDirectories)

            .Where(fi => regex.IsMatch(fi.Name));

(此示例过滤名称中包含两位数字的文件)

为了模拟这个,编写一个递归枚举器方法(yield return)来返回所有文件,并像这样过滤结果:

 IEnumerable<FileInfo> Recurse(string topdir)
 { 
      // for each GetFiles() array element
      //      if is_not_dir yield return
      //      else Recurse(subdir)          
 }

 var filtered = Recurse.Where(fi => regex.IsMatch(fi.Name));

HTH

【讨论】:

    【解决方案2】:

    修改您的递归循环并获得一个模式列表。例如

    static private void walk(String name)
    {
        try
        {
            foreach (String pattern in Patterns)
            {
                foreach (String f in Directory.GetFiles(name, pattern))
                {
                    Console.WriteLine(f);
                 } 
            }
                foreach (String d in Directory.GetDirectories(name))
            {
                walk(d);
            }
        }
        catch
        {
    
        }
    

    }

    【讨论】:

    • 这几乎就是我在之前的文章中提到的关于必须多次检查每个文件夹的内容,每个特定扩展名一次。这是实现这一目标的唯一方法吗?对我来说似乎效率很低。
    • 我在想,好吧,您有 2 个选择,获取所有文件详细信息,然后使用正则表达式或包含文件名匹配的文件或多次扫描来测试自己。我会进行时间比较,因为它可能比您想象的要快得多。
    【解决方案3】:

    【讨论】:

      【解决方案4】:

      如果你只想获取所有的excel文件,使用模式“.xl”。

      否则我建议在没有模式的情况下调用Directory.GetFiles 并手动过滤匹配的扩展名。

      【讨论】:

        【解决方案5】:

        要遍历目录和子目录,无论子文件夹或文件有多少,您都可以将文件放入数组中。 您可以在扩展部分指定您想要的文件类型、Jpeg、Excel、Msword。

        string [] Excel_Files;
        String path = "what ever is your path";
        
        Files=  Directory.GetFiles(Path, "*.XL", SearchOption.AllDirectories).Select(x => Path.GetFileName(x)).ToArray();
        

        或者要为不同的文件扩展名指定多个搜索选项,您可以这样做:

        public string[] getFiles(string SourceFolder, string Filter, 
         System.IO.SearchOption searchOption)
        {
        
        ArrayList alFiles = new ArrayList();
        
         string[] MultipleFilters = Filter.Split('|');
        
         foreach (string FileFilter in MultipleFilters)
         {
               alFiles.AddRange(Directory.GetFiles(SourceFolder, FileFilter, searchOption));
         }
        
         return (string[])alFiles.ToArray(typeof(string));
        }
        
        public void button_click()
        {
        
        string[] sFiles = getFiles(Server.MapPath("~/"), 
         "*.gif|*.jpg|*.png|*.bmp|*.XL|*.PNG", 
         SearchOption.AllDirectories);
        
        foreach (string FileName in sFiles)
        {
         Response.Write(FileName + "<br />");
        }
        }
        

        【讨论】:

          【解决方案6】:

          我认为第二种选择更有效。使用以下模式循环遍历每个文件:.xl,然后缩小列表以寻找特定的结尾。

          类似:

          foreach (String f in Directory.GetFiles(path, "*.xl*", SearchOption.AllDirectories))
          {
              if (HasSomeExcelExtension(f))
                  files .Add(f);
          }
          

          您可以使用 EndsWith 方法检查每个扩展名的“f”,或使用 Path.GetExtension 方法提取扩展名并在包含所需扩展名的哈希表中查找它。

          只是我的 $.02 hth

          【讨论】:

            猜你喜欢
            • 2013-10-21
            • 1970-01-01
            • 2016-12-01
            • 1970-01-01
            • 2010-12-01
            • 2016-09-06
            • 2013-06-17
            • 2012-12-26
            • 1970-01-01
            相关资源
            最近更新 更多