1

这是我方法中的代码:

t = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
string[] textfiles = ApplyAllFiles(t, "*.txt", ProcessFile).ToArray();

然后我也做了:

s = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
string[] textfiles = ApplyAllFiles(s, "*.jpg", ProcessFile).ToArray();

ApplyAllFiles 方法:

static void ProcessFile(string path) {/* ... */}

static IEnumerable<string> ApplyAllFiles(string folder, string searchPattern, Action<string> fileAction)
{
     IEnumerable<string> files = Directory.GetFiles(folder, searchPattern);
     foreach (string file in files)
     {
         fileAction(file);
     }

     foreach (string subDir in Directory.GetDirectories(folder))
     {
         try
         {
             files = files.Concat(ApplyAllFiles(subDir, searchPattern, fileAction));
         }
         catch
         {
              // swallow, log, whatever
         }
      }

      return files;
}
  1. 它没有从主目录获取文件,例如第一个主目录是:C:\Users\bout0_000\Documents 我在这个目录中有一些文本文件。它将从
    Documents 的子目录中获取所有文本文件,但永远不会获取 C:\Users\bout0_000\Documents 中的文本文件

  2. 我怎样才能获得不止一个扩展,例如我做了“*.jpg”,但我还想获得 bmp 文件、png 文件和 gif 文件。

4

1 回答 1

1

你为什么不直接使用SearchOption.AllDirectories?然后你就不需要Concator 递归了。你可以说

static void ApplyAllFiles(string folder, string searchPattern, Action<string> fileAction)
{
    foreach (string file in Directory.GetFiles(folder, searchPattern, SearchOption.AllDirectories))
        fileAction(file);
}

这是有问题的过载。或者你可以使用EnumerateFiles.

不幸的是,该searchPattern参数不支持多种扩展模式,因此您必须自己做。像这样的东西:

static void ApplyAllFiles(string folder, Action<string> fileAction)
{
    foreach (string file in
             Directory
             .EnumerateFiles(folder, "*", SearchOption.AllDirectories)
             .Where(f => new[] {".jpg", ".txt"}.Contains(Path.GetExtension(f))))
        fileAction(file);
}
于 2013-08-11T04:20:40.747 回答