C# 在.Net 3.5中使用GetDirectory()识别错误的重解析点?
我正在使用带有Linq语句的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
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/InvokeNtQueryDirectoryFile
,记录为ZwQueryDirectoryFile
从MSDN:
可以通过以下任一方式查询此信息:
调用,将FileReparsePointInformation
作为FileInformationClass的值传递,并将调用方分配的FILE\u reparsepoint\u INFORMATION
-结构化缓冲区作为FileInformation
的值传递
创建带有主功能代码和次功能代码的IRPIRP\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
属性。