подсчитать количество файлов с заданным расширением в каталоге - C++?

Возможно ли в С++ подсчитать количество файлов с заданным расширением в каталоге?

Я пишу программу, где было бы неплохо сделать что-то вроде этого (псевдокод):

if (file_extension == ".foo")
    num_files++;
for (int i = 0; i < num_files; i++)
    // do something

Очевидно, что эта программа намного сложнее, но она должна дать вам общее представление о том, что я пытаюсь сделать.

Если это невозможно, просто скажите мне.

Спасибо!


person Alex    schedule 20.12.2009    source источник


Ответы (3)


В самих стандартах C или C++ ничего не говорится об обработке каталогов, но практически любая достойная ОС будет иметь такого зверя, например, функции findfirst/findnext или readdir.

То, как вы это сделаете, - это простой цикл по этим функциям, проверяющий конец строк, возвращаемых для нужного вам расширения.

Что-то типа:

char *fspec = findfirst("/tmp");
while (fspec != NULL) {
    int len = strlen (fspec);
    if (len >= 4) {
        if (strcmp (".foo", fspec + len - 4) == 0) {
            printf ("%s\n", fspec);
        }
    }
    fspec = findnext();
}

Как уже говорилось, фактические функции, которые вы будете использовать для обхода каталога, зависят от ОС.

Для UNIX почти наверняка будет использоваться opendir, readdir и closedir. Этот код является хорошей отправной точкой для этого:

#include <dirent.h>

int len;
struct dirent *pDirent;
DIR *pDir;

pDir = opendir("/tmp");
if (pDir != NULL) {
    while ((pDirent = readdir(pDir)) != NULL) {
        len = strlen (pDirent->d_name);
        if (len >= 4) {
            if (strcmp (".foo", &(pDirent->d_name[len - 4])) == 0) {
                printf ("%s\n", pDirent->d_name);
            }
        }
    }
    closedir (pDir);
}
person paxdiablo    schedule 20.12.2009
comment
В обоих случаях выше. Не будет ли цикл for(;;) более аккуратным? - person Martin York; 20.12.2009
comment
Думаю, дело вкуса или стиля, @Martin. Я склонен использовать циклы for для простых вещей (в основном сортировка for i = от 1 до 10) и использовать while для более сложных циклов. Но в любом случае это не имеет отношения к рассматриваемому вопросу. - person paxdiablo; 21.12.2009

Этот вид функциональности зависит от ОС, поэтому стандартного переносимого метода для этого не существует.

Однако с помощью библиотеки файловой системы Boost вы можете делать это и многие другие операции, связанные с файловой системой, переносимым способом.

person Ramon Zarazua B.    schedule 20.12.2009

Прежде всего, для какой ОС вы пишете?

  • Если это Windows, найдите FindFirstFile и FindNextFile в MSDN.
  • Если вы ищете код для систем POSIX, прочитайте man для opendir и readdir или readdir_r.
  • Для кросс-платформы я бы предложил использовать библиотеку Boost.Filesystem.
person Artyom    schedule 20.12.2009