* FASTEST * список каталогов - PullRequest
6 голосов
/ 27 августа 2010

У меня огромные каталоги, и я хотел бы прочитать все файлы так быстро, как только смогу.Я имею в виду, не быстрый DirectoryInfo.GetFiles, а быстрый «get-clusters-from-disk-low-level».

Конечно, .NET 2.0, c #

Подобный вопрос был здесь,но этот подход не принес ничего хорошего:

C # Каталог, содержащий массивный каталог

Кто-то предложил pInvoke для FindFirst / FindNext.Кто-нибудь пробовал это и может поделиться результатами?

Ответы [ 3 ]

5 голосов
/ 27 августа 2010

Для "нормального" подхода, в основном, все сводится к FindFirstFile / FindNextFile, на самом деле вы не получаете намного быстрее, чем это ... и это не супер-турбо-быстрое.

Если вам действительно нужна скорость, изучите чтение MFT вручную - но знайте, что для этого требуются права администратора, и он может сломаться при каждом обновлении NTFS (и , не будет работать для файловых систем не-NTFS). Возможно, вы захотите взглянуть на этот код , в котором есть USN и MFT.

Однако, возможно, есть другое решение. Если ваше приложение работает постоянно и нуждается в получении изменений, вы можете начать с одного медленного FindFirstFile / FindNextFile прохода, а затем использовать поддержку уведомлений об изменениях каталогов, чтобы получать информацию об обновлениях ..., которая работает для ограниченных пользователей. и не зависит от структуры файловой системы.

3 голосов
/ 12 января 2012

Для лучшей производительности можно использовать P / Invoke NtQueryDirectoryFile, задокументированный как ZwQueryDirectoryFile.

(Это не касается прямого доступа к диску и непосредственного чтения структур необработанной файловой системы, что обычно нецелесообразно.)

0 голосов
/ 27 августа 2010

Попробуйте использовать что-то вроде этого DirectoryManager и уточните его в соответствии со своими потребностями.Работает быстрее, чем .NET Framework GetDirectories() или GetFiles(), потому что мы пропустили там кроссплатформенные проверки и адаптации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...