如何处理 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[] { };
}
})
我发现了一些不错的帖子,可以使用以下代码获取 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[] { };
}
})