Выявление неверных точек 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,

Другие вопросы по тегам