*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() потому что мы пропустили там кроссплатформенные проверки и адаптации.

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