【问题标题】:How to EnumerateFiles with all subdirectories with C# DirectoryInfo?如何使用 C# DirectoryInfo 枚举所有子目录的文件?
【发布时间】:2013-11-27 22:02:08
【问题描述】:

我发现这段代码可以从 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();

但它会产生错误。

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

感谢您的帮助!

【问题讨论】:

    标签: c# winforms file-io enumeration directoryinfo


    【解决方案1】:

    查看DirectoryInfo.EnumerateFiles 的重载 - 没有重载只是 SearchOption,但你可以给出一个字符串和一个SearchOption

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

    【讨论】:

    • 你的速度太快了我们没有得分机会
    • 我不知道"*"。谢谢 :) 8 分钟后可以接受。
    • 这正是我所需要的,谢谢。顺便说一句,仍然不被接受:P
    • 不要使用它,因为在 Windows 文件系统中迭代它(IENUMERABLE,例如使用 foreach)是非常危险的,因为可能存在访问限制。在这样的代码中循环遍历“文件”的不少目录会抛出异常。阅读msdn.microsoft.com/en-us/library/dd997370.aspx:“枚举所有目录中的 FileInfo 对象的集合”。您需要将 EnumerateFiles 和 EnumerateDirectories 嵌套为一个解决方案,因为 EnumerateFiles 似乎仅在第一目录级别上是“安全的”。
    • @Philm:这不是非黑即白。当然,如果您从根目录或系统目录等开始,这可能会引发异常 - 但在许多情况下,调用者对他们正在使用的目录结构了解更多,因此不需要额外的复杂性。 (我还认为“极其危险”是非常强烈的夸张 - 如果某些东西会对您的系统造成重大伤害,我会说它是“极其危险”的。抛出异常不会破坏您的系统,除非您您的代码中还有其他更严重的问题。)
    猜你喜欢
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 2018-07-21
    • 2023-03-19
    • 2016-10-20
    • 2013-06-21
    相关资源
    最近更新 更多