4

我正在使用Directory.GetDirectories()Linq 语句来遍历文件夹中不是系统文件夹的所有目录,但是我在文件夹中发现了一堆坏ReparsePoints的,这导致该方法需要很长时间,因为每个都超时重解析点不好。

我目前使用的代码如下所示:

subdirectories = directory.GetDirectories("*", SearchOption.TopDirectoryOnly)
    .Where(d => ((d.Attributes & FileAttributes.Hidden) != FileAttributes.Hidden)
         && ((d.Attributes & FileAttributes.System) != FileAttributes.System));

我也尝试过使用这样的代码进行测试,但它也会在坏文件夹上挂起整整一分钟左右:

foreach (var item in dir.GetDirectories("*", SearchOption.TopDirectoryOnly))
{
    Console.WriteLine(item.Name);
    Console.WriteLine(item.Attributes);
}

应该注意的是,上述代码在 .Net 4.0 中运行良好,但在 3.5 中,它会在每个错误的重解析点挂起一分钟。

尝试在 Windows 资源管理器中手动打开这些文件夹会导致“找不到网络路径”错误。

是否有另一种方法可以遍历不使用该Attributes属性的文件夹中的好子文件夹,或者绕过错误的重解析点?

我已经尝试过使用Directory.Exists(),这同样慢。

4

1 回答 1

0

根据这个答案:*FASTEST* 目录列表

为了获得最佳性能,可以 P/Invoke NtQueryDirectoryFile,记录为ZwQueryDirectoryFile

来自 MSDN:FILE_REPARSE_POINT_INFORMATION结构

可以通过以下两种方式之一查询该信息:

调用ZwQueryDirectoryFileFileReparsePointInformation作为 FileInformationClass 的值传递,并将调用者分配的结构化FILE_REPARSE_POINT_INFORMATION缓冲区作为 的值传递FileInformation

创建具有主要功能代码IRP_MJ_DIRECTORY_CONTROL和次要功能代码的 IRP IRP_MN_QUERY_DIRECTORY

于 2013-09-11T20:53:48.390 回答