一般来说,获取指定文件夹下的所有文件名,用python是较为方便的,直接:
import os
files_name = os.listdir(“一个路径”)
但也有c++程序偶尔也有这个需求,下面就直接上c++在windows和linux去读取文件夹下文件名的方法,不同的系统代码上有一些差别
Windows(vs)
vs的环境,主要是用到了头文件<io.h>
,还有以下的几点说明,大伙可以按需修改,我在代码中也做了详细的注释:
- 这个遇到文件夹会回归调用,所以如果不想让其进入,就在找到文件夹时直接continue;
- 保存的仅仅是文件名,也可以保存绝对路径,在下面的else中改一下就好了;
- 当然可以加个format格式参数,就只保留想要的后缀的文件,就自己去改了。
#include <iostream>
#include <vector>
#include <string>
#include <io.h>
void GetAllFiles(std::string path, std::vector<std::string> &files) {
struct _finddata_t fileinfo;
intptr_t hFile = 0;
std::string p;
if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1) {
do {
if ((fileinfo.attrib & _A_SUBDIR)) {
if (std::strcmp(fileinfo.name, ".") != 0 && std::strcmp(fileinfo.name, "..") != 0) {
files.push_back(p.assign(path).append("\\").append(fileinfo.name));
GetAllFiles(p.assign(path).append("\\").append(fileinfo.name), files);
}
}
else {
files.push_back(p.assign(fileinfo.name));
}
} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
int main(int argc, char* argv[]) {
std::string file_path = "E:\\PycharmProject\\wrench\\screwLine_demo";
std::vector<std::string> files_name;
GetAllFiles(file_path, files_name);
for (auto k : files_name) {
std::cout << k << std::endl;
}
system("pause");
return 0;
}
效果:

Linux
- io.h 头文件可能不兼容跨平台操作。在windows下这个头文件运行稳定,但是在linux下这个头文件有点不一样,就换了下;
- linux需要头文件
<dirent.h>
;
- 这个代码不会进到所给文件夹里面,只会把给定文件夹下的文件夹名、文件名列出来,像python的os.listdir(),有需要的话,自己改一下就好了。
#include <iostream>
#include <vector>
#include <sys/types.h>
#include <dirent.h>
#include <cstring>
void GetFileName(std::string path, std::vector<std::string> &files) {
DIR *pDir;
struct dirent *ptr;
if (!(pDir = opendir(path.c_str()))) return;
while ((ptr = readdir(pDir)) != 0) {
if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0) {
files.push_back(path + "/" + ptr->d_name);
}
}
closedir(pDir);
}
int main(int argc, char* argv[]) {
std::string file_path = "/home/nian/123";
std::vector<std::string> files_name;
GetFileName(file_path, files_name);
for (auto iter = files_name.cbegin(); iter != files_name.cend(); ++iter) {
std::cout << *iter << std::endl;
}
return 0;
}
希望能帮到你。