使用.Net 3.5中的GetDirectories()识别错误的ReparsePoints?
我正在使用带有Linq语句的Directory.GetDirectories()
来遍历文件夹中不是系统文件夹的所有目录,但是我发现文件夹中有一堆坏的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()
,这同样很慢。
根据这个答案: * FASTEST *目录列表
为了获得最佳性能,可以使用P / Invoke
NtQueryDirectoryFile
,记录为ZwQueryDirectoryFile
来自MSDN: FILE_REPARSE_POINT_INFORMATION
结构
可以通过以下任一方式查询此信息:
调用
ZwQueryDirectoryFile
,将FileReparsePointInformation
作为FileInformationClass的值传递,并将调用者分配的FILE_REPARSE_POINT_INFORMATION
缓冲区作为FileInformation
的值传递。使用主要function代码
IRP_MJ_DIRECTORY_CONTROL
和次要function代码IRP_MN_QUERY_DIRECTORY
创建IRP。