2013-07-18 3 views
1

Попытка получить подсчет всех файлов в папке, соответствующей заданной маске, но вы хотите избежать расходов на возврат каждого матча или даже списка, так как может быть потенциально десятки тысяч матчей.Самый быстрый вызов для подсчета совпадающих файлов в каталоге Windows?

Я мог бы делать FindNextFile несколько раз, пока не закончил, но это много дорогостоящих поездок в оба конца.

Есть функция удобства для этого?

Это код используется сейчас, и так как все, что мне нужно, это граф, ищет менее дорогостоящий способ попасть туда:

string[] files = System.IO.Directory.GetFiles(Path, InFileMask); 
if (files.Length == ExpectedCount) 
+4

Сомневаюсь, что вы будете бить 'FindNextFile'. Что заставляет вас думать, что это медленно? http://stackoverflow.com/questions/15351288/is-there-a-faster-alternative-to-enumerating-folders-than-findfirstfile-findnext –

+0

Надеюсь, что FS уже хранит каталог имен файлов, это будет быстрый вызов для запроса с совпадением и возвращает только счет, а не список файлов. FindNextFile - это много круговых поездок, которые мне не нужны, поскольку мне приходится постоянно рассчитывать, так как количество файлов постоянно меняется. –

+0

Что значит «продолжать подсчет повторно»? Есть ли еще больше того, что вы не говорите. –

ответ

2

Вы должны быть в состоянии достичь этого, используя Microsoft Indexing Service. Также есть another article here. К сожалению, он не всегда активен в каждой системе и, следовательно, не полностью надежен.

Лучшим вариантом будет внедрение собственной службы индексирования. Вы можете сканировать весь компьютер при запуске приложения и полагаться на FileSystemWatcher для прослушивания изменений файлов в системе. Таким образом, вы можете реализовать очень быстрое перечисление файлов, и вы сможете возвращать количество файлов менее чем за микросекунды.

Простым подходом будет использовать отличный Faster Directory Enumeration Tool, который также имеет поддержку маски/фильтра, которая может справиться с этим. например

var filesCount = FastDirectoryEnumerator.GetFiles(Path, InFileMask).Length; 
+0

Похоже, служба индексирования - это путь. У FasterDirectoryEnumerator есть некоторые проблемы, которые, как описано в комментариях, будут проблемами в этой ситуации. Я сделаю некоторое тестирование и вернусь к этому с результатами! –

0

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

Утечка будет поддерживать актуальность кеша. Насколько это боль будет зависеть именно от того, что вы пытаетесь сделать.

+0

Вы можете использовать службу индексирования, которая уже поддерживает базу данных этой информации. –

+0

@ Raymond: Как я могу запросить службу индексирования для подсчета файлов в папке, соответствующей фильтру? Я думаю, это то, что вы указываете, возможно, вашим ответом. –

+0

Я просто выполнил поиск MSDN в службе индексирования и посмотрел, я нашел [Обзор поиска Windows] (http://msdn.microsoft.com/en-us/library/aa965362 (v = vs.85) .aspx) и [Запросить индекс программно] (http://msdn.microsoft.com/en-us/library/bb266517 (v = vs.85) .aspx) и [Образцы SDK для поиска Windows] (http: // www. microsoft.com/en-us/download/details.aspx?id=7388). –

Смежные вопросы