Как узнать, сколько файлов в каталоге? - PullRequest
11 голосов
/ 08 декабря 2008

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

Ответы [ 4 ]

14 голосов
/ 08 декабря 2008

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

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

7 голосов
/ 08 декабря 2008

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

3 голосов
/ 08 декабря 2008

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

1 голос
/ 08 декабря 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...