.net - Directory.EnumerateFiles => UnauthorizedAccessException

标签 .net filesystems lazy-evaluation unauthorizedaccessexcepti

.NET 4.0 中有一个很好的新方法,可以通过枚举以流式方式获取目录中的文件。

这里的问题是,如果希望枚举所有文件,则可能无法提前知道哪些文件或文件夹受到访问保护,并且可能会抛出 UnauthorizedAccessException。

要重现,只需运行此片段即可:

foreach (var file in Directory.EnumerateFiles(@"c:\", "*", SearchOption.AllDirectories))
{
   // whatever
}

在此 .NET 方法存在之前,可以通过在字符串数组返回方法上实现递归迭代器来实现大致相同的效果。但它并不像新的 .NET 方法那么懒惰。

那该怎么办呢?使用此方法时,UnauthorizedAccessException 可以被抑制吗?还是确实存在?

在我看来,该方法应该有一个重载,接受一个操作来处​​理任何异常。

最佳答案

我无法使上述工作正常,但这是我的实现,我在“Win7”机器上的 c:\users 上测试了它,因为如果有所有这些“讨厌的”目录:

SafeWalk.EnumerateFiles(@"C:\users", "*.jpg", SearchOption.AllDirectories).Take(10)

类(class):

public static class SafeWalk
{
    public static IEnumerable<string> EnumerateFiles(string path, string searchPattern, SearchOption searchOpt)
    {   
        try
        {
            var dirFiles = Enumerable.Empty<string>();
            if(searchOpt == SearchOption.AllDirectories)
            {
                dirFiles = Directory.EnumerateDirectories(path)
                                    .SelectMany(x => EnumerateFiles(x, searchPattern, searchOpt));
            }
            return dirFiles.Concat(Directory.EnumerateFiles(path, searchPattern));
        }
        catch(UnauthorizedAccessException ex)
        {
            return Enumerable.Empty<string>();
        }
    }
}

关于.net - Directory.EnumerateFiles => UnauthorizedAccessException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5098011/

相关文章:

Python os.walk 和日本文件名崩溃

haskell - 惰性评估如何允许更大的模块化?

java - JPA 惰性插入

sql - 避免 Oracle SQL 查询中不必要的联接

c# - WPF - 在一段时间内检测鼠标按下

c# - 将动态创建的位图对象绑定(bind)到 WPF 中的图像

java - java 遍历文件系统

Java锁定新创建的目录

.net - 给定 XElement,如何在给定 XPath 的情况下检索对另一个相关 XElement/Xattribute 的引用?

c# - 如何将枚举中所有常量的值提取到 char 数组中?