如何使用C# DirectoryInfo枚举所有子目录中的文件?

5
我发现了这段代码,它从 DirectoryInfo 中获取一个文件数组:
FileInfo[] fileInfoArray = di.EnumerateFiles().Where(f => extensions.Contains(f.Extension.ToLower())).ToArray();

但是它只搜索DirectoryInfo路径下的直接子目录,不包括子孙目录。

我猜我需要在某个地方添加SearchOption.AllDirectories参数,但是在哪里添加呢?

我尝试过:

di.EnumerateFiles(SearchOption.AllDirectories).Where(f => extensions.Contains(f.Extension.ToLower())).ToArray();

但是它会产生一个错误。

那么我如何使用模式搜索,包括所有子目录?

感谢任何帮助!

1个回答

12

查看 DirectoryInfo.EnumerateFiles 的重载 - 没有接受仅包含 SearchOption 的重载,但您可以提供一个字符串和一个 SearchOption

var files = di.EnumerateFiles("*", SearchOption.AllDirectories)
              .Where(f => extensions.Contains(f.Extension.ToLower()))
              .ToArray();

1
你太快了,我们没有得分的机会。 - Bassam Alugili
1
我不知道 "*"。谢谢 :) 8分钟后可以接受。 - jeff
这正是我所需要的,谢谢。顺便说一句,还没有被接受 :P - MC10
不要使用此方法,因为在 Windows 文件系统中遍历 IENUMERABLE(例如使用 foreach)非常危险,因为可能存在访问限制。在不少目录中,通过此代码循环“文件”将会抛出异常。请阅读 https://msdn.microsoft.com/en-us/library/dd997370.aspx :“枚举所有目录中的 FileInfo 对象”。您需要嵌套 EnumerateFiles 和 EnumerateDirectories 作为一种解决方案,因为 EnumerateFiles 似乎只在第一个目录级别上是“安全”的。 - Philm
2
@Philm:情况并不是那么简单。当然,如果你从根目录或系统目录等开始,这可能会引发异常,但在许多情况下,调用者对他们正在使用的目录结构了解更多,就没有必要增加额外的复杂性。(我认为“极其危险”是相当强烈的夸张言辞 - 我会说如果某个东西会对你的系统造成重大伤害,那么它就是“极其危险”的。除非你的代码存在其他更严重的问题,否则抛出异常不会破坏你的系统。) - Jon Skeet
@Jon Skeet:当然,你是正确的——如果你非常确定上下文和使用的目录,你就不必捕获任何东西;-) 我认为这样的代码很可能被用作片段,至少可以轻松地复制并用于不同的上下文。在我看来,唯一的建议是:将这个容易出错的任务放在你自己的库中经过充分测试的函数中,其中一部分当然是完整的错误处理。 - Philm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接