Как узнать, сколько файлов находится в каталоге?
Мне нужно получить количество файлов в каталоге. Я мог бы получить имена всех файлов в каталоге с помощью 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, чтобы получить только счет (но я могу быть удивлен!).
Преимущество метода: гибкость - вы можете отфильтровать некоторые типы файлов, спускаться рекурсивно или игнорировать папки и т.д.
Если метод медленный для вас, может быть, вы должны получить лучший метод, например, не создавать массив, заполненный информацией каталога (требуется время, чтобы заполнить его, не говоря уже о стоимости памяти и времени сбора мусора), но используя итератор: немного больше работы (но как только вы получаете функцию, она всегда присутствует), но гораздо эффективнее.