2010-08-27 3 views
6

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

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

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

C# Directory listing massive directory

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

+0

Использование отражателя он выглядит DirectoryInfo.GetFiles в конечном счете сводится к FindFirstFile/FindNextFile Kernel32 вызовов в любом случае. –

ответ

5

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

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

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

1

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

+2

Очень красивый маленький класс, он использует 'FindFirstFile/FindNextFile'. Лично я бы добавил копию кода здесь вместо ссылки на другой сайт, на всякий случай, если один снижается. – Thymine

+5

@Eugene Cheverda Ссылка DirectoryManager больше не работает: P –

3

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

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

Смежные вопросы