一般来说,获取指定文件夹下的所有文件名,用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>

// 可在这个函数中再加一个format格式参数,push到vector前判断下文件名后缀,仅保留指定格式
void GetAllFiles(std::string path, std::vector<std::string> &files) {
	// 用来存储文件信息的结构体,在头文件 <io.h>
	struct _finddata_t fileinfo;  // _finddata_t 这是一个struct类,c++中可以不要前面的struct的

	intptr_t hFile = 0;  
	
	std::string p;  // 不在这p(path)初始化
	// 第一次查找
	if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1) {
		do {
			// 如果找到的是文件夹
			if ((fileinfo.attrib & _A_SUBDIR)) {
				// 不想进入文件夹,就在这里continue
				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));  
				// 也可以是保存绝对路径
				// files.push_back(p.assign(path).append("\\").append(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;   //  是头文件<dirent.h>的类型
    struct dirent *ptr;  // opendir、readdir这些都是头文件dirent.h
    if (!(pDir = opendir(path.c_str()))) return;
    while ((ptr = readdir(pDir)) != 0) {
        // strcmp是C语言里的,只导入string,然后std::strcmp都是没有的
        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;
}

希望能帮到你。

Logo

更多推荐