Выявление неверных точек ReparsePoints с помощью GetDirectories() в.Net 3.5?
Я использую 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()
и это одинаково медленно.
1 ответ
Согласно этому ответу: * FASTEST * список каталогов
Для лучшей производительности, возможно P/Invoke
NtQueryDirectoryFile
задокументировано какZwQueryDirectoryFile
Из MSDN: FILE_REPARSE_POINT_INFORMATION
состав
Эта информация может быть запрошена одним из следующих способов:
Вызов
ZwQueryDirectoryFile
, проходяFileReparsePointInformation
в качестве значения FileInformationClass и передачи выделенного абонента,FILE_REPARSE_POINT_INFORMATION
структурированный буфер как значениеFileInformation
,Создать IRP с основным кодом функции
IRP_MJ_DIRECTORY_CONTROL
и второстепенный код функцииIRP_MN_QUERY_DIRECTORY
,