Как узнать, сколько файлов находится в каталоге?

Мне нужно получить количество файлов в каталоге. Я мог бы получить имена всех файлов в каталоге с помощью System.IO.Directory.GetFiles() и взять длину этого массива, но это слишком длится в больших каталогах. Есть ли способ получить только счет без необходимости получать имена?

Ответы

Ответ 1

Я так не верю, нет - по крайней мере, не в vanilla.NET. Я подозреваю, что это не фактическая выборка имен, которые требуют времени - это ОС, проходящий через внутренние каталоги. Может быть вызов Win32, который вы можете сделать через P/Invoke.

Насколько велик каталог, на который вы смотрите? В общем, по крайней мере, традиционно не было хорошей идеей иметь более нескольких сотен файлов в каталоге. Файловые системы в целом улучшились, но я не знаю, что такое текущее состояние с NTFS и Fat32.

Ответ 2

Я сделал небольшой тест - написал ту же задачу в С++/Qt и С++/CLI:

LARGE_INTEGER i1, i2;       

QueryPerformanceCounter(&i1);       

int count = IO::Directory::GetFiles(L"c:\\windows\\system32")->Length;

QueryPerformanceCounter(&i2);

__int64 result = i2.QuadPart - i1.QuadPart;

Результат составляет около 16.500.000

и

LARGE_INTEGER i1, i2;

QueryPerformanceCounter(&i1);

intcount = QDir("c:/windows/system32").entryList(QDir::Files).count();

QueryPerformanceCounter(&i2);

__int64 result += i2.QuadPart - i1.QuadPart;

Результат составляет около 2.100.000.000

Количество файлов - 2125

Ответ 3

Нет более быстрого способа. Независимо от того, что вы используете, все сводится к вызовам FindFirstFile и FindNextFile Win32.
Вы можете попробовать использовать что-то вроде this, но, вероятно, потребуется столько же времени - но, возможно, с меньшим потреблением памяти (= возможно не стоит).

Ответ 4

До сих пор на большинстве языков, с которыми я столкнулся, вы получаете эту информацию только путем перехода к папке и подсчета файлов. Я сомневаюсь, что есть вызов Windows API, чтобы получить только счет (но я могу быть удивлен!).
Преимущество метода: гибкость - вы можете отфильтровать некоторые типы файлов, спускаться рекурсивно или игнорировать папки и т.д.

Если метод медленный для вас, может быть, вы должны получить лучший метод, например, не создавать массив, заполненный информацией каталога (требуется время, чтобы заполнить его, не говоря уже о стоимости памяти и времени сбора мусора), но используя итератор: немного больше работы (но как только вы получаете функцию, она всегда присутствует), но гораздо эффективнее.