подсчитать общее количество файлов в каталоге, используя c ++ - PullRequest
3 голосов
/ 08 ноября 2011

Я пытаюсь получить количество файлов в каталоге через c ++ для Unix OS
У меня есть этот код

int i;
i = (int)system("ls -l /root/opencv/*.png|wc -l");
cout << "Number of files " << i << endl;

Но я получаю вывод как

21
Number of files 0

Как я могу получить 21 в i

Ответы [ 5 ]

6 голосов
/ 08 ноября 2011

Несмотря на то, что вы указываете ОС, переносное решение может быть желательным.

Boost :: Filesystems directory_iterator и std :: count_if - это то, что вы ищете.Предикат для count_if может использовать либо std::regex, либо все, что вам достаточно.

Вот минимальный пример, демонстрирующий желаемое поведение (без рекурсии):

#include <boost/filesystem.hpp>
#include <iostream>
#include <algorithm>

namespace fs = boost::filesystem;

int main()
{
  int i =  std::count_if(fs::directory_iterator("/your/path/here/"),
                         fs::directory_iterator(), 
                         [](const fs::directory_entry& e) { 
                          return e.path().extension() == ".png";  });
  //also consider recursive_directory_iterator
  std::cout << i << std::endl;
  return 0;
}
6 голосов
/ 08 ноября 2011

То, что вы хотите, может быть легко достигнуто с помощью функции glob (2):

#include <glob.h>
int glob(const char *pattern, int flags,
                int (*errfunc) (const char *epath, int eerrno),
                glob_t *pglob);

Простой пример (без обработки ошибок):

glob_t gl;
size_t num = 0;
if(glob("/root/opencv/*.png", GLOB_NOSORT, NULL, &gl) == 0)
  num = gl.gl_pathc;
globfree(&gl);
cout << "Number of files: " << num << endl;
3 голосов
/ 08 ноября 2011

Вызов system возвращает состояние завершения оболочки в UNIX. Поэтому имеет смысл вернуть 0.

Вам нужно будет проанализировать вывод функции system, если вы хотите получить количество файлов. В противном случае используйте системный вызов, чтобы подсчитать, сколько PNG-файлов в каталоге вы хотите.

Посмотрите на функции opendir и readdir. Лучше использовать эти функции вместо анализа system output.

2 голосов
/ 08 ноября 2011

Этого следовало ожидать.Документация системы гласит:

Возвращаемое значение

Возвращаемое значение равно -1 при ошибке (например, при отказе fork (2)) и состоянии возвратакоманды в противном случае.

Вы действительно не хотите вызывать систему, и здесь, стандартный способ сделать это - через opendir и readdir для всегоили через glob , если вы просто ищете шаблоны имен файлов.

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

1 голос
/ 08 ноября 2011

Это происходит потому, что вы получаете возвращаемое значение команды, а не выходные данные.

Если вы хотите использовать системную команду ls, а не opendir и readdir, как предлагали другие, вам следует использовать popen вместо system:

#include <stdio.h>

int main() 
{
    FILE *in;
    char buff[512];

    /* popen creates a pipe so we can read the output
       of the program we are invoking */
    if (!(in = popen("ls -l /root/opencv/*.png|wc -l", "r"))) 
    {  
        /* if popen failed */
        return 1;
    }

    /* read the output of ls, one line at a time */
    while (fgets(buff, sizeof(buff), in) != NULL ) 
    {
        printf("Number of files: %s", buff);
    }

    /* close the pipe */
    pclose(in);
    return 0;
}
...