【问题标题】:Get files from directory with pattern [duplicate]从具有模式的目录中获取文件[重复]
【发布时间】:2010-09-23 06:13:50
【问题描述】:

可能重复:
Can you call Directory.GetFiles() with multiple filters?

是否有可能获得前任。 <em>.c</em>.h目录中的文件。 Directory.GetFiles("C:\", "<em>.c;</em>.h"); 的使用不起作用。两次调用Directory.GetFiles(...); 太糟糕了.. :(

谢谢。

【问题讨论】:

    标签: c# .net file directory


    【解决方案1】:

    如果您使用的是 .NET 4.0,我会选择 Directory.EnumerateFiles

    var files = from f in Directory.EnumerateFiles("C:\\")
                where f.EndsWith(".c") || f.EndsWith(".h")
                select f;
    

    【讨论】:

    • @Yuriy:.NET 4.0 唯一的特点就是使用了Directory.EnumerateFiles()。将其更改为Directory.GetFiles(),它应该可以正常工作。
    • @Jeff M:我可能是错的,但我很确定@Yuriy 想避免调用GetFiles() 来规避填充(可能)巨大的string[] 数组的成本。跨度>
    • 如果是这种情况,那么获取所有文件然后进行过滤将不是处理此问题的最佳方法。 ;) 我认为 Yuriy 想在一次调用中应用这些过滤器,而不是手动编写两个单独的调用,根据选择的答案,这似乎是合理的。
    • @Jeff: 是的——但它仍然比GetFiles() 便宜(内存方面),并且会立即开始返回值(无需先获取所有文件)。但你是对的;从接受的答案来看,实际上,OP似乎并不太关心这一点。
    【解决方案2】:

    不可能在单个 GetFiles() 方法调用中指定多个过滤器。你可以找到替代品here

    【讨论】:

      【解决方案3】:

      你可以试试这样的:

       var query = from p in Directory.GetFiles(@"C:\").AsEnumerable()
                          where p.Contains(".c")
                          || p.Contains(".h")
                          select p;
      

      【讨论】:

      • 没有理由在这里调用 AsEnumerable。 GetFiles 已经填满了整个数组。
      【解决方案4】:

      对于 .Net 3.5。

      public IEnumerable<string> GetFiles(
           string basePath, 
           params string[] searchPatterns)
      {
          if (searchPatterns == null || searchPatterns.Length == 0)
          {
              return Directory.GetFiles(basePath);
          }
      
          return Enumerable.SelectMany(searchPatterns, 
                               p => Directory.GetFiles(basePath, p));
      }
      

      用法:

      GetFiles(@"c:\", "*.c", "*.h");
      

      您可能想要添加一些验证

      【讨论】:

        【解决方案5】:

        使用扩展方法查看How to get files with multiple extensions

        【讨论】:

          【解决方案6】:

          这里有一些有用的辅助函数来模拟多个过滤器:

          // .NET 4.0 friendly
          public static IEnumerable<string> EnumerateFiles(string path, params string[] filters)
          {
              return filters.Length == 0
                  ? Directory.EnumerateFiles(path)
                  : filters.SelectMany(filter => Directory.EnumerateFiles(path, filter));
          }
          
          // .NET 3.5 friendly
          public static IEnumerable<string> GetFiles(string path, params string[] filters)
          {
              return filters.Length == 0
                  ? Directory.GetFiles(path)
                  : filters.SelectMany(filter => Directory.GetFiles(path, filter));
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-08-20
            • 2020-08-29
            • 1970-01-01
            • 1970-01-01
            • 2021-11-04
            • 2011-03-12
            相关资源
            最近更新 更多