使用LINQ在驱动器中枚举文件以跳过回收站

时间:2014-06-20 11:03:27

标签: c# linq

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

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:\目录raise UnauthorisedAccessException。在this topic中解释并使用了同样的问题,但没有使用LINQ来解决它。

我希望有一个解决方案,使用LINQ跳过回收站并转到其他目录。这可能吗?正如你所看到的,我已经尝试过检查名称的方式,但这并没有解决我的问题。

(如何)我可以使用LINQ跳过回收站吗?

编辑:我实际上在我的C:\目录(OS目录)中也发现了一个问题:C:\ $ Recycle.Bin

1 个答案:

答案 0 :(得分:0)

我害怕你不能。

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

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

作为旁注,不仅Recycle Bin会抛出异常,而且运行流程的用户无法访问所有其他目录。

你应该找到你发现的单独枚举文件和目录的解决方案(使用try / catch)。