*FASTEST* список каталогов
У меня есть массивные каталоги, и я хотел бы прочитать все файлы так быстро, как я могу. Я имею в виду, не быстрый DirectoryInfo.GetFiles, а быстрый "get-clusters-from-disk-low-level".
Конечно.NET 2.0, C#
Подобный вопрос был здесь, но этот подход не был хорошим:
Каталог C#, перечисляющий массивный каталог
Кто-то предложил pInvoke на FindFirst/FindNext. Кто-нибудь пробовал это и может поделиться результатами?
3 ответа
Для "нормального" подхода в основном все сводится к FindFirstFile
/FindNextFile
Вы действительно не становитесь намного быстрее чем это... и это не супер-турбо-быстрое.
Если вам действительно нужна скорость, посмотрите на чтение MFT вручную - но знайте, что для этого требуются права администратора, и он может ломаться всякий раз, когда обновляется NTFS (и, о да, не будет работать с файловыми системами, отличными от NTFS). Возможно, вы захотите взглянуть на этот код, который содержит USN и MFT.
Однако, возможно, есть другое решение. Если ваше приложение работает постоянно и требует изменений, вы можете начать с одного медленного FindFirstFile
/FindNextFile
передать, а затем использовать поддержку уведомлений об изменении каталога, чтобы получать уведомления об обновлениях..., которые работают для ограниченных пользователей и не зависят от структур файловой системы.
Для лучшей производительности можно использовать P/Invoke NtQueryDirectoryFile, задокументированный как ZwQueryDirectoryFile.
(Это не касается прямого доступа к диску и непосредственного чтения структур необработанной файловой системы, что обычно нецелесообразно.)
Попробуйте использовать что-то вроде этого DirectoryManager и уточнить его в соответствии с вашими потребностями. Работает быстрее, чем.NET Framework GetDirectories()
или же GetFiles()
потому что мы пропустили там кроссплатформенные проверки и адаптации.