我试图通过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
答案 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_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;
}
答案 2 :(得分:3)
system
调用返回UNIX中shell的退出状态。因此,它返回0
是有意义的。
如果要获取文件计数,则需要解析system
函数的输出。否则,使用系统调用来计算所需目录上的PNG文件数。
查看opendir
和readdir
个功能。最好使用这些函数而不是解析system
输出。
答案 3 :(得分:2)
这是可以预料的。 documentation系统说:
返回值
错误时返回的值为-1(例如fork(2)失败),否则返回命令的返回状态。
你真的不想在这里打电话给系统和ls,标准的方法是通过opendir和readdir整个或通过glob如果你只是寻找文件名模式。
如果你坚持产生三个进程来计算目录中的文件数,你应该查看popen来读取命令的输出。
答案 4 :(得分:1)
这是因为您获得了命令的返回值,而不是输出。
如果您想使用系统命令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;
}