2013-05-17 104 views
5

我试图列出在给定目录下的所有文件,同时考虑子目录以及帐户。我使用yield以便我可以在此处调用Take, (请注意,我正在使用.NET 3.5)。使用枚举查找文件夹中的所有文件

下面是我的代码:

IEnumerable<string> Search(string sDir) 
{ 
     foreach (var file in Directory.GetFiles(sDir)) 
     { 
      yield return file;     
     } 

     foreach (var directory in Directory.GetDirectories(sDir)) 
     { 
       Search(directory);     
     } 
} 

我不知道是怎么回事错,但它只返回一个文件(这是根目录下的一个,也是唯一有一个有作为好)。你能帮忙吗?

+12

不要重新发明轮子。使用'Directory.EnumerateFiles'和'Directory.EnumerateDirectories'。 – Oded

+0

噢,你不是'搜索(目录)'的回报,这可能是这里的一个问题。 – Oded

+0

感谢Oded..will Directory.EnumerateFiles和Directory.EnumerateDirectories在.NEt 3.5中工作? – Mike

回答

12

你需要得到递归搜索的结果,否则,你只是把上面的结果远:

IEnumerable<string> Search(string sDir) 
{ 
    foreach (var file in Directory.GetFiles(sDir)) 
    { 
     yield return file;     
    } 

    foreach (var directory in Directory.GetDirectories(sDir)) 
    { 
     foreach(var file in Search(directory)) 
      yield return file; 
    } 
} 

请注意,如果您意图是简单地让每一个文件的简单列表,考虑使用Directory.GetFiles而不是搜索所有子目录。如果您的意图是利用LINQ(或其他方法)来应用搜索条件或对检索到的文件总数进行限制,那么这是一个体面的方法,因为您一次只能阅读一次目录,一旦“已经达到你的标准。

+5

不会[Directory.GetFiles(String,String, SearchOption)](http://msdn.microsoft.com/en-us/library/ms143316.aspx)是否更合适? –

+0

编码与技术的巅峰之作。 – lsalamon

+0

在某些方面,即使在.Net 4或更高版本上编写自己的版本也很方便 - 因为.Net 4版本由于无法访问系统文件夹而没有任何简单的方法处理异常。至少如果你自己动手,你可以添加适当的处理。然而,.Net 3.5 * *具有'Directory.GetFiles(字符串,字符串,SearchOption)',正如约翰H所说的那样!但我更喜欢这个。 –

相关问题