Мне нужно подсчитать количество файлов в каталоге. Я мог бы получить имена всех файлов в каталоге, используя System.IO.Directory.GetFiles()
, и взять длину этого массива, но для больших каталогов это занимает слишком много времени. Есть ли способ получить только количество без необходимости получать имена?
Как узнать, сколько файлов находится в каталоге?
Ответы (4)
Я так не думаю, нет, по крайней мере, не в ванильном .NET. Я подозреваю, что это не фактическая выборка имен, которая занимает время - это ОС, проходящая через внутренние каталоги. может быть вызов Win32, который вы можете сделать через P/Invoke.
Насколько велик каталог, который вы просматриваете? В целом, по крайней мере, традиционно не рекомендуется иметь более нескольких сотен файлов в каталоге. Файловые системы в целом улучшились, но я не знаю, как обстоят дела с NTFS и Fat32.
Я сделал небольшой тест - написал одну и ту же задачу на C++/Qt и C++/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
Нет более быстрого способа. Независимо от того, что вы используете, все сводится к FindFirstFile
и FindNextFile
вызовам Win32.
Вы можете попробовать использовать что-то вроде это, но это, вероятно, займет столько же времени, но, возможно, с меньшим использованием памяти (= вероятно, оно того не стоит).
До сих пор на большинстве языков, с которыми я сталкивался, вы получаете эту информацию, только просматривая папку и подсчитывая файлы. Сомневаюсь, что есть вызов Windows API для получения только количества (но я могу удивиться!).
Преимущество метода: гибкость — вы можете отфильтровать некоторые типы файлов, рекурсивно пройти вниз или игнорировать папки и т. д.
Если метод медленный для вас, возможно, вам следует найти лучший метод, например, не создавать массив, заполненный информацией о каталоге (требуется время, чтобы заполнить его! не говоря уже о затратах памяти и времени сборки мусора), а использовать итератор: немного больше работать (но как только вы получаете функцию, она всегда там), но гораздо эффективнее.