C# 使用枚举查找文件夹中的所有文件

C# 使用枚举查找文件夹中的所有文件,c#,C#,我试图通过考虑子目录来列出给定目录下的所有文件。我使用的是yield,这样我就可以将其与我称之为的Take合并(注意,我使用的是.NET3.5) 下面是我的代码: IEnumerable<string> Search(string sDir) { foreach (var file in Directory.GetFiles(sDir)) { yield return file; }

我试图通过考虑子目录来列出给定目录下的所有文件。我使用的是yield,这样我就可以将其与我称之为的Take合并(注意,我使用的是.NET3.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);                
       }
}
IEnumerable搜索(字符串sDir)
{
foreach(Directory.GetFiles(sDir)中的var文件)
{
生成返回文件;
}
foreach(directory.GetDirectories(sDir)中的var目录)
{
搜索(目录);
}
}

我不知道这里出了什么问题,但它只返回一个文件(根目录下的文件,那里也只有一个)。您能帮忙吗?

您需要生成递归搜索的结果,否则您只是将其结果扔掉:

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;
    }
}
IEnumerable搜索(字符串sDir)
{
foreach(Directory.GetFiles(sDir)中的var文件)
{
生成返回文件;
}
foreach(directory.GetDirectories(sDir)中的var目录)
{
foreach(搜索中的var文件(目录))
生成返回文件;
}
}

注意,如果您的意图是简单地获取每个文件的平面列表,那么可以考虑使用该选项来搜索所有子目录。如果您的目的是利用LINQ(或其他方法)应用搜索条件或限制检索的文件总数,那么这是一个不错的方法,因为您将一次读取一个目录,并在满足条件后停止。

不要重新发明轮子。使用
Directory.EnumerateFiles
Directory.EnumerateDirectories
。哦,您没有
返回
搜索(目录)
,这可能是这里的问题之一。谢谢Oded...Directory.EnumerateFiles和Directory.EnumerateDirectories在.NEt 3.5中工作吗?@Oded“注意,我正在使用.NEt 3.5” .. 如果您对
目录.EnumerateFiles
目录.GetFiles
之间的差异感到好奇,请参阅此处:这不是更合适吗?使用技术的顶峰进行编码。在某些方面,即使在.Net 4或更高版本上编写自己的版本也很方便,因为.Net 4版本没有任何简单的方法来处理由于无法访问系统文件夹而导致的异常。至少如果你自己滚动,你可以添加适当的处理。然而,.NET3.5确实有
目录.GetFiles(string,string,SearchOption)
,正如John H所说!但我更喜欢这个。@JohnH可能属于“不要重新发明轮子”的评论。我专门回答了Mike的问题,关于为什么他的实现不起作用。还要注意的是,
Directory.GetFiles
是急切地进行评估的,这可能需要很长的时间或大量的内存,这取决于它的使用情况,而这个实现是延迟的。这很公平。我链接到一个问题,上面描述了实现细节。