如何处理 EnumeratFiles 或 EnumeratFolders 上的 PLINQ 查询中的 c# 异常

How to handle c# exceptions in PLINQ query on EnumeratFiles or EnumeratFolders

我发现了一些不错的帖子,可以使用以下代码获取 and/or 个文件夹的总文件数:

  DirectoryInfo dirInfo = new DirectoryInfo(myBaseDirectory + @"\");
          var count = await Task.FromResult(dirInfo.EnumerateDirectories()
                   .AsParallel()
                   .SelectMany(di => di.EnumerateFiles("*.*", SearchOption.AllDirectories))
                   .Count() + dirInfo.EnumerateFiles("*.*", SearchOption.TopDirectoryOnly).Count());

效果很好。直到我尝试访问 NTFS 格式的驱动器。然后在 EnumerateFiles 函数上抛出异常。这是卷信息文件夹上的 UnauthorizedAccessException。

现在我的问题是,我如何重写这段代码,以便在抛出异常时,代码保持 "looping"。换句话说,它只是跳过引发异常的文件或文件夹。

我 try-catch around 整个代码都不起作用。据我现在的理解,我应该在 selectMany 部分中放置一个 try-catch。类似于:

.SelectMany(di => { try { di.EnumerateFiles("*.*", SearchOption.AllDirectories); } catch{ }})

但是代码无法编译。有什么建议吗?

当里面有try..catch这样的block语句时不能使用短lambda语法(隐含其唯一语句的表达式值为return值)(more here) .
在您的情况下,您需要使用 return 语句来指示哪个表达式是 lambda 函数的结果:

SelectMany(di => { 
    try 
    { 
        return di.EnumerateFiles("*.*", SearchOption.AllDirectories); 
    } 
    catch 
    { 
        /* just skip */
        return new FileInfo[] { };
    }
})