подсчитать количество файлов с заданным расширением в каталоге - C ++? - PullRequest
2 голосов
/ 20 декабря 2009

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

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

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

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

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

Спасибо!

Ответы [ 3 ]

6 голосов
/ 20 декабря 2009

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

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

5 голосов
/ 20 декабря 2009

В самих стандартах 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);
}
1 голос
/ 20 декабря 2009

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

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