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

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


person Simon    schedule 08.12.2008    source источник


Ответы (4)


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

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

person Jon Skeet    schedule 08.12.2008
comment
Действительно, сама файловая система не ведет счет. Он должен посчитать весь список, чтобы найти счет, поэтому это занимает столько же времени. - person configurator; 08.12.2008
comment
что вы подразумеваете под ванильным .NET? - person Pacerier; 05.10.2011
comment
@Pacerier: я имею в виду без вызовов P/Invoke функции Win32. - person Jon Skeet; 05.10.2011

Я сделал небольшой тест - написал одну и ту же задачу на 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

person abatishchev    schedule 08.12.2008

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

person Vincent Van Den Berghe    schedule 08.12.2008

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

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

person PhiLho    schedule 08.12.2008