Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.Net 3.5中使用GetDirectory()识别错误的重解析点?_C#_.net 3.5_Reparsepoint - Fatal编程技术网

C# 在.Net 3.5中使用GetDirectory()识别错误的重解析点?

C# 在.Net 3.5中使用GetDirectory()识别错误的重解析点?,c#,.net-3.5,reparsepoint,C#,.net 3.5,Reparsepoint,我正在使用带有Linq语句的Directory.GetDirectories()循环遍历文件夹中非系统文件夹的所有目录,但是我在文件夹中发现了大量错误的重分析点,这导致该方法在每个错误的重分析点上超时,需要很长时间 我当前使用的代码如下所示: subdirectories = directory.GetDirectories("*", SearchOption.TopDirectoryOnly) .Where(d => ((d.Attributes & FileAttrib

我正在使用带有Linq语句的
Directory.GetDirectories()
循环遍历文件夹中非系统文件夹的所有目录,但是我在文件夹中发现了大量错误的
重分析点
,这导致该方法在每个错误的重分析点上超时,需要很长时间

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

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);
}
应该注意的是,上述代码在.NET4.0中运行良好,但在3.5中,它将在每个错误的重新分析点上挂起一分钟

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

在不使用
属性
属性的文件夹中,或者绕过错误的重新分析点的文件夹中,是否有其他方法循环浏览好的子文件夹


我已经尝试过使用
目录.Exists()
,但速度同样慢。

根据这个答案:

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

从MSDN:

可以通过以下任一方式查询此信息:

调用,将
FileReparsePointInformation
作为FileInformationClass的值传递,并将调用方分配的
FILE\u reparsepoint\u INFORMATION
-结构化缓冲区作为
FileInformation
的值传递

创建带有主功能代码和次功能代码的IRP
IRP\u MN\u QUERY\u目录


我发现,流式处理流程的输入在性能方面几乎是相同的,不需要异常处理,实际上更健壮、更可靠。奇怪但真实(至少对我来说是真实的)@Rachel,你有没有试过用你的
Where
子句从搜索中排除
FileAttributes.ReparsePoint
,访问
FileAttributes
属性会导致性能问题。这可能是一个愚蠢的问题-但是您是否尝试将FileAttributes.ReparsePoint排除作为where子句中的第一个检查?i、 其中(d=>((d.Attributes&FileAttributes.ReparsePoint)!=FileAttributes.ReparsePoint)&((d.Attributes&FileAttributes.Hidden)!=FileAttributes.Hidden)&((d.Attributes&FileAttributes.System)!=FileAttributes.System))@SeanHosey Yes,访问
FileAttributes
属性是导致问题的原因,因为目录实际上并不存在,所以当它试图检查它是否包含
ReparsePoint
或任何其他值时,大约需要一分钟的时间才能找出错误重分析点的
FileAttributes
属性。