在c ++中recursion的文件夹扫描

我想扫描目录树并列出每个目录内的所有文件和文件夹。 我创build了一个程序,从webcamera下载图像并保存到本地。 该程序根据下载图片的时间创build一个文件树。 我现在想要扫描这些文件夹,并将图像上传到networking服务器,但我不知道如何扫描目录来查找图像。 如果有人可以发布一些示例代码,这将是非常有帮助的。

编辑 :我在一个embedded式的Linux系统上运行这个,不想使用提升

Solutions Collecting From Web of "在c ++中recursion的文件夹扫描"

看到man ftw一个简单的“文件树步行”。 在这个例子中我也使用了fnmatch

 #include <ftw.h> #include <fnmatch.h> static const char *filters[] = { "*.jpg", "*.jpeg", "*.gif", "*.png" }; static int callback(const char *fpath, const struct stat *sb, int typeflag) { /* if it's a file */ if (typeflag == FTW_F) { int i; /* for each filter, */ for (i = 0; i < sizeof(filters) / sizeof(filters[0]); i++) { /* if the filename matches the filter, */ if (fnmatch(filters[i], fpath, FNM_CASEFOLD) == 0) { /* do something */ printf("found image: %s\n", fpath); break; } } } /* tell ftw to continue */ return 0; } int main() { ftw(".", callback, 16); } 

(甚至没有经过编译测试,但你明白了。)

这比处理DIRENT和递归遍历要简单得多。


为了更好地控制遍历,还有fts 。 在这个例子中,点文件(名称以“。”开头的文件和目录)被跳过,除非明确地传递给程序作为起点。

 #include <fts.h> #include <string.h> int main(int argc, char **argv) { char *dot[] = {".", 0}; char **paths = argc > 1 ? argv + 1 : dot; FTS *tree = fts_open(paths, FTS_NOCHDIR, 0); if (!tree) { perror("fts_open"); return 1; } FTSENT *node; while ((node = fts_read(tree))) { if (node->fts_level > 0 && node->fts_name[0] == '.') fts_set(tree, node, FTS_SKIP); else if (node->fts_info & FTS_F) { printf("got file named %s at depth %d, " "accessible via %s from the current directory " "or via %s from the original starting directory\n", node->fts_name, node->fts_level, node->fts_accpath, node->fts_path); /* if fts_open is not given FTS_NOCHDIR, * fts may change the program's current working directory */ } } if (errno) { perror("fts_read"); return 1; } if (fts_close(tree)) { perror("fts_close"); return 1; } return 0; } 

再次,它既没有经过编译测试,也没有经过测试,但我想我会提到它。

Boost.Filesystem允许你这样做。 查看文档 !

编辑:
如果您使用的是Linux,并且您不想使用Boost,则必须使用Linux本机C函数。 这个页面显示了很多关于如何做的例子。

我是老学校,没有ftw()对我来说! 这是粗糙的(从我做C编程直到现在已经有一段时间了),很多东西都是硬编码的,而且我可能搞乱了strnc *()函数的长度计算,但是你明白了。 K&R btw中有一个类似的例子。

 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <dirent.h> void listdir(char* dirname, int lvl); int main(int argc, char** argv) { if (argc != 2) { fprintf(stderr, "Incorrect usage!\n"); exit(-1); } listdir(argv[1], 0); return 0; } void listdir(char* dirname, int lvl) { int i; DIR* d_fh; struct dirent* entry; char longest_name[4096]; while( (d_fh = opendir(dirname)) == NULL) { fprintf(stderr, "Couldn't open directory: %s\n", dirname); exit(-1); } while((entry=readdir(d_fh)) != NULL) { /* Don't descend up the tree or include the current directory */ if(strncmp(entry->d_name, "..", 2) != 0 && strncmp(entry->d_name, ".", 1) != 0) { /* If it's a directory print it's name and recurse into it */ if (entry->d_type == DT_DIR) { for(i=0; i < 2*lvl; i++) { printf(" "); } printf("%s (d)\n", entry->d_name); /* Prepend the current directory and recurse */ strncpy(longest_name, dirname, 4095); strncat(longest_name, "/", 4095); strncat(longest_name, entry->d_name, 4095); listdir(longest_name, lvl+1); } else { /* Print some leading space depending on the directory level */ for(i=0; i < 2*lvl; i++) { printf(" "); } printf("%s\n", entry->d_name); } } } closedir(d_fh); return; } 

你将要使用在dirent.h中声明的目录函数。 这个维基百科页面描述了它们,并包括示例代码。 对于你的应用程序,一旦你已经确定了一个目录,你将需要递归调用处理函数来处理目录内容。

你也可以使用glob / globfree。

我认为,如果你可以使用Qt / Embedded,QDir和QFileInfo类可以帮助你,但这取决于你是否可以使用Qt。 问题是你的系统提供了哪个API。