Как я могу эффективно получить количество файлов в каталоге?
-
22-07-2019 - |
Вопрос
Есть ли способ (в Windows, использующей Delphi 2010) получить количество файлов в каталоге без фактического обхода всех файлов?
Я хочу реализовать индикатор выполнения во время операции индексирования файловой системы. По этой причине мне нужно знать, сколько файлов в каталоге.
Какой самый быстрый способ узнать количество файлов в каталоге?
Решение
Я думаю, что самый быстрый способ - это использовать метод TDirectory.GetFiles, расположенный в IOutils.pas. Так как количество (видимых) файлов в каталоге может быть разным для каждого пользователя, существует лишь небольшая вероятность того, что есть просто число, которое можно каким-либо образом извлечь.
Подход FindFirst / FindNext (заключенный в описанном выше методе) фактически не перебирает файлы, он только обходит записи в таблице, поэтому он может быть быстрее, чем ожидалось.
Другие советы
Если вы работаете в Windows 7 или Server 2008 R2, я рекомендую извлечь функции FindFirst и FindMatchingFile из SysUtils и взломать первый для использования FindFirstFileEx вместо FindFirstFile. Затем вы можете установить для параметра дополнительных флагов значение 2 (определенное в MSDN как FIND_FIRST_EX_LARGE_FETCH
) с этим параметром, в который включены (Win32majorversion = 6) и (Win32minorversion > = 1), в настоящее время. р>
Этот параметр приводит к очень значительному увеличению скорости для циклов FindFirst / FindNext в этих ОС. Найдите FindFirstFileEx в MSDN для получения дополнительной информации, например последняя документация отсутствует в документации Microsoft, полученной с помощью справки Delphi.
TDirectory.GetFiles, похоже, в конечном счете вызывает FindFirst, поэтому не принесет вам больших преимуществ, кроме упрощения вашего собственного кода.