使用c ++计算目录中存在的文件总数

时间:2011-11-08 13:31:00

标签: c++ filesystems directory

我试图通过c ++为unix操作系统获取目录中的文件数量 我有这个代码

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 个答案:

答案 0 :(得分:6)

使用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;

答案 1 :(得分:6)

虽然您指定了操作系统,但可能需要使用便携式解决方案。

Boost :: Filesystems directory_iteratorstd::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;
}

答案 2 :(得分:3)

system调用返回UNIX中shell的退出状态。因此,它返回0是有意义的。

如果要获取文件计数,则需要解析system函数的输出。否则,使用系统调用来计算所需目录上的PNG文件数。

查看opendirreaddir个功能。最好使用这些函数而不是解析system输出。

答案 3 :(得分:2)

这是可以预料的。 documentation系统说:

  

返回值

     

错误时返回的值为-1(例如fork(2)失败),否则返回命令的返回状态。

你真的不想在这里打电话给系统和ls,标准的方法是通过opendirreaddir整个或通过glob如果你只是寻找文件名模式。

如果你坚持产生三个进程来计算目录中的文件数,你应该查看popen来读取命令的输出。

答案 4 :(得分:1)

这是因为您获得了命令的返回值,而不是输出。

如果您想使用系统命令ls而不是其他人建议的opendirreaddir,则应使用 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;
}