问题描述
在使用程序对大量文件进行批处理的任务中通常需要扫描某个目录下的指定文件。而这个在脚本语言如python中很容易实现的功能在C++中做会有点不方便,复杂的命名规则则将需要用到正则表达式(std::regex)。这里提供了Linux系统下两种实现方法,并且用一个函数包装起来,这样输入输出就很明确了。两种方法区别在于筛选后缀和文件名排序。
如果需要扫描指定目录和该目录下文件夹的,只要递归地执行此函数即可。如果在windows系统上需要使用不同库并对这里的文件相关的操作函数进行替换。由于指定前缀比较容易实现,这里只实现指定后缀的方法,指定前缀或者使用正则表达式的更复杂命名规则的可以参考来写。
这里将问题描述为输入指定路径std::string path
和指定后缀std::string suffix
,输出文件列表std::vector<std::string> file_list
。为了得到正确的输出,输入path
结尾需要以/
结尾例如:./data/
。不加/
不影响筛选功能,只是输出的文件列表会少一个/
。另外后缀suffix
需要把.
带上,例如:.txt
实现1:readdir获取文件+sort排序
#include <string>
#include <vector>
#include <stdio.h>
#include <dirent.h>
#include <algorithm>
bool LoadFileList(const std::string path, const std::string suffix,
std::vector<std::string>& file_list) {
// 打开指定路径path
DIR *dir{
opendir(path.c_str())};
// check if the path is valid