2010-05-10 4 views
8

Как получить общее количество файлов в каталоге с помощью стандартной библиотеки C++? Любая помощь приветствуется.Количество файлов в каталоге с использованием C++

+1

Работа с каталогом относительно ОС, в которой вы находитесь, к сожалению. Итак, отправляйте сообщение с какой ОС вы пытаетесь, тогда, возможно, мы сможем вам помочь. – Daniel

+0

Кросс-платформенный код для работы как с Windows, так и с Linux. Я использую mingw, gcc и msvc вместе с библиотекой wxWidgets, используя boost, но не привязываясь к его библиотекам, включая только заголовки. Функции fstat и _stat у нас есть в #include . , чтобы получить информацию о файле. Есть ли у нас аналогичная поддержка для получения сведений о каталогам? – harik

ответ

11

Вы не можете. Самое близкое, что вы сможете получить, это использовать что-то вроде Boost.Filesystem

+6

После этого это тривиально: 'int count = std :: difference (directory_iterator (dir_path), directory_iterator());' – MSalters

+4

@MSalters, я не могу найти ссылку на 'std :: difference'. Вы уверены, что не имели в виду 'std :: distance'? Кроме того, вам понадобится 'static_cast ' для принуждения 'directory_iterator :: difference_type' к' int'. –

+0

Я пытаюсь избежать ссылки на библиотеки Boost и использовать только заголовки для алгоритмов. – harik

2

Вам понадобится использовать собственный API или фреймворк.

13

Если вы не исключите в основном доступную стандартную библиотеку C, вы можете использовать ее. Потому что он доступен везде, в отличие от boost, это довольно удобный вариант!

Приводится пример here.

И здесь:

#include <stdio.h> 
#include <sys/types.h> 
#include <dirent.h> 

int main (void) 
{ 
    DIR *dp; 
    int i; 
    struct dirent *ep;  
    dp = opendir ("./"); 

    if (dp != NULL) 
    { 
    while (ep = readdir (dp)) 
     i++; 

    (void) closedir (dp); 
    } 
    else 
    perror ("Couldn't open the directory"); 

    printf("There's %d files in the current directory.\n", i); 

    return 0; 
} 

И действительно

> $ ls -a | wc -l 
138 
> $ ./count 
There's 138 files in the current directory. 

Это не C++ вообще, но он доступен на большинстве, если не во всех операционных системах, и будет работать в C++ независимо.

ОБНОВЛЕНИЕ: Я исправлю свое предыдущее заявление об этом, являющемся частью стандартной библиотеки C - это не так. Но вы можете перенести эту концепцию в другие операционные системы, потому что у всех есть свои способы работы с файлами без необходимости извлекать дополнительные библиотеки.

+0

-1: Стандартная библиотека C не дает возможности перечислить каталог. –

+5

Это глупое голосование. Конечно, вы можете считать файлы с помощью стандартной библиотеки C.Возьмем пример, который я включил в свой пост, вместо того, чтобы называть «puts ...» внутри while, используемого для итерации по каждому файлу, просто «i ++» и объявить «int i» где-то выше. Конечно, нет функции «directory_get_file_count», но это не главное. Дело в том, что вы можете использовать его для получения желаемого результата, а именно количества файлов в папке. Черт возьми, позвольте мне изменить свой первоначальный ответ ложным ответом, сек – LukeN

+1

-1, 'readdir' - это POSIX не стандарт C. – MSalters

1

Если они хорошо названы, отсортированы и имеют одинаковое расширение, вы можете просто подсчитать их со стандартной библиотекой C++.

Предположим, что имена файлов похожи на «img_0.jpg..img_10000.jpg..img_n.jpg», Просто проверьте, находятся ли они в папке или нет.

int Trainer::fileCounter(string dir, string prefix, string extension) 
{ 
    int returnedCount = 0; 
    int possibleMax = 5000000; //some number you can expect. 

    for (int istarter = 0; istarter < possibleMax; istarter++){ 
     string fileName = ""; 
     fileName.append(dir); 
     fileName.append(prefix); 
     fileName.append(to_string(istarter)); 
     fileName.append(extension); 
     bool status = FileExistenceCheck(fileName); 

     returnedCount = istarter; 

     if (!status) 
      break; 
    } 

    return returnedCount; 
} 

bool Trainer::FileExistenceCheck(const std::string& name) { 
    struct stat buffer; 
    return (stat(name.c_str(), &buffer) == 0); 
} 
6

старый вопрос, но так как он появляется в первую очередь на поиск Google, я думал, чтобы добавить свой ответ, так как у меня была потребность что-то подобное.

int findNumberOfFilesInDirectory(std::string& path) 
{ 
    int counter = 0; 
    WIN32_FIND_DATA ffd; 
    HANDLE hFind = INVALID_HANDLE_VALUE; 

    // Start iterating over the files in the path directory. 
    hFind = ::FindFirstFileA (path.c_str(), &ffd); 
    if (hFind != INVALID_HANDLE_VALUE) 
    { 
     do // Managed to locate and create an handle to that folder. 
     { 
      counter++; 
     } while (::FindNextFile(hFind, &ffd) == TRUE); 
     ::FindClose(hFind); 
    } else { 
     printf("Failed to find path: %s", path.c_str()); 
    } 

    return counter; 
} 
Смежные вопросы