Как я могу эффективно получить количество файлов в каталоге?

StackOverflow https://stackoverflow.com/questions/1648975

Вопрос

Есть ли способ (в 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, поэтому не принесет вам больших преимуществ, кроме упрощения вашего собственного кода.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top