«Все» создает индекс в фоновом режиме, поэтому запросы относятся к индексу, а не к самой файловой системе.
Необходимо внести несколько улучшений - по крайней мере, по прямому алгоритму:
Сначала поиск по ширине по поиску по глубине. То есть перечислите и обработайте все файлы в одной папке, прежде чем переходить в найденные вами подпапки. Это улучшает местность - обычно очень много.
В Windows 7 / W2K8R2 вы можете использовать FindFirstFileEx
с FindExInfoBasic
, главное ускорение - пропуск короткого имени файла в файловых системах NTFS, где это включено.
Отдельные потоки помогают, если вы перечисляете разные физические диски (не только диски). Для того же диска это помогает, только если это SSD («нулевое время поиска») или вы тратите значительное время на обработку имени файла (по сравнению с временем, затраченным на доступ к диску).
[редактировать] Википедия на самом деле есть некоторые комментарии -
По сути, они пропускают уровень абстракции файловой системы и получают прямой доступ к NTFS. Таким образом, они могут пакетировать вызовы и пропускать дорогостоящие сервисы файловой системы, такие как проверка ACL.
Хорошей отправной точкой была бы техническая справка NTFS в MSDN.