我正在尝试通过将子目录记入帐户来列出给定目录下的所有文件。我正在使用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);
}
}
我不知道这里出了什么问题,但它只返回一个文件(根目录下的文件,并且只有一个文件)。你能帮忙吗?
答案 0 :(得分: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;
}
}
请注意,如果 intent 只是获取每个文件的平面列表,请考虑使用Directory.GetFiles而不是搜索所有子目录的选项。如果您的目的是利用LINQ(或其他方法)来应用搜索条件或对检索到的文件总数的限制,那么这是一个不错的方式,因为您将一次读取一个目录并在“已经达到了你的标准。