使用LINQ枚举驱动器中的文件,跳过回收站。

4

我正在编写一个小方法,它可以检索给定输入字符串和给定驱动器的所有完整文件名。我的方法如下:

private IEnumerable<string> FindOccurences(string searchQuery, DriveInfo drive)
{
    return drive.RootDirectory
        .EnumerateFiles("*" + searchQuery + "*", SearchOption.AllDirectories)
        .Where(file => !file.FullName.Contains("RECYCLE"))
        .Select(file => file.FullName);
}

在没有回收站的驱动器上一切正常,但当枚举文件并进入回收站时,我的 C:\D:\ 目录引发了未经授权的访问异常 (UnauthorisedAccessException)。这个问题在 this topic 中有解释和用法,但没有使用 LINQ 解决。

我希望能够使用 LINQ 跳过回收站并继续处理其他目录。这可能吗?如您所见,我已经尝试通过检查名称来解决问题,但这并没有解决我的问题。

我该如何使用 LINQ 跳过回收站?

编辑: 实际上我在我的 C:\ 目录(操作系统目录)中也找到了一个实例:C:\$Recycle.Bin


有趣。我从来没有想过回收站是一个实际的目录,而只是一个“已删除”项目的构造列表。 - Flater
从 Raymond Chen 的精彩博客中得知:如何判断一个目录是否真的是回收站?http://blogs.msdn.com/b/oldnewthing/archive/2008/09/18/8956382.aspx - Jason Evans
1个回答

0

很抱歉,您不能这样做。

GetFiles不同,EnumerateFiles不会在内存中加载整个结果列表:您可以在搜索结束之前枚举结果。

但是,在返回特定目录的任何结果之前,它将始终要求对当前正在搜索的目录进行权限。这意味着它会在检查Where子句之前抛出异常。

顺便说一下,不仅回收站会抛出异常,而且用户运行您的进程没有访问权限的所有其他目录也会抛出异常

您应该选择您找到的解决方案,分别枚举文件和目录(使用try/catch)。


真是太糟糕了。我喜欢我的原始方法的简洁性。不过还是谢谢你的帮助! - Matthijs

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