c++在windows、linux下获取指定文件夹下所有文件名的方法
标签: c++ 开发语言 linux visualstudio
一般来说,获取指定文件夹下的所有文件名,用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;
}
希望能帮到你。
智能推荐
Java读取文件夹下的所有文件名及绝对路径
读取文件夹下的所有文件名 读取文件夹中的文件名主要使用了文件file的listFiles方法和list方法 文件夹内容如图所示: 运行结果如图所示: **其中 list方法是获取该目录下的所有文件的名字 listFiles方法是获取该目录下所有文件的绝对路径...
Win10 导出文件夹下的所有文件名
Win10 导出文件夹下的所有文件名 一、方法:使用`cmd`命令行的`dir`命令 二、具体使用命令: 三、命令解释 四、Dir 参数补充 一、方法:使用cmd命令行的dir命令 演示图: 二、具体使用命令: 三、命令解释 dir /B 列出当前目录下的所有文件、 >> d:/a.txt 将文件导出到 d盘下的 a.txt 效果图: 四、Dir 参数补充 上面使用的 /B 使用的是空...
C++获取指定路径文件夹下的所有图片
使用场景 获取某路径下的图片,再逐张传入TensorRT进行识别,但是如果要做连续帧处理,需要将图片序列从小到大排序, 因为原来读取进去的图片列表是乱序的。 Code 两个版本的不同点在于GetImagePaths函数的实现。 Windows Linux 执行结果 - Windows 原顺序(乱序) 新顺序(升序) 问题汇总 _finddata_t是一个windows下的结构体, 只适用于wind...
Mybatis源码的下载,搭建以及阅读源码的姿势
源码下载 mybatis的源码是在github上开源的,所以直接从github上搜索下载即可。 如上图,第一个就是mybatis3的源码项目,下面几个也是项目中常用的依赖项目,分页插件pagehelper,SSM项目需要引入的依赖mybatis-spring,mybatis-plus项目等。 当前最新版本是v3.5.5,可以选择合适的版本下载。我本地选择的是v3.5.4版本,小版本之间没有太大差异...
spring cloud + redis RedisTemplate Api搭建简单Demo
简介 Redis是一种NoSQL数据库,即非关系型数据库。redis是一个key-value存储系统。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,r...
猜你喜欢
c++在windows、linux下获取指定文件夹下所有文件名的方法
一般来说,获取指定文件夹下的所有文件名,用python是较为方便的,直接: import os files_name = os.listdir(“一个路径”) 但也有c++程序偶尔也有这个需求,下面就直接上c++在windows和linux去读取文件夹下文件名的方法,不同的系统代码上有一些差别 Windows(vs) vs的环境,主要是用到了头文件<io.h>,...
计算机图形学实验一绘制任意斜率的直线段
一、实验目的 (1)掌握任意斜率直线段的重点 Bresenham 扫描转换算法; (2)掌握 Cline 直线类的设计方法; (3)掌握状态栏编程方法。 二、实验步骤 (1)创建MFC应用程序 (2)定义CLine类 添加消息处理的处理程序 三、实验结果 四、实验体会 在本次实验中,通过不断的探索和实践,我学会了如何创建一个MFC应用程序,将理论运用于实践...
CSS盒模型
盒子模型 盒子模型是什么 CSS盒子模型就是在CSS技术所使用的一种思维模型。CSS假定所有的HTML文档元素都生成一个描述该元素在HTML文档布局中所占空间的矩形元素框,可以形象地将其看作是一个盒子。通过定义一系列与盒子相关的属性,可极大地丰富和促进各个盒子乃至整个HTML文档的表现效果和布局结构。CSS盒子模型由内容区、填充、边框和空白边四部分组成。内容区是盒子模型的中心,呈现盒子的主要信息内...
通用分页
通用分页 我们从数据库里面拿到的数据要进行分页首先需要连接到数据库 这些类是不能少的;这是获得数据库对象的类 pageBean 首先我们需要把想要分页的属性进行一个封装,一个分页的工具类 BookDao 然后我们需要一个dao方法 ,就以BookDao 为案列 我们需要继承baseDao通用dao方法进行一个分页实现(BaseDao在后面) BaseDao 这个是通用的dao方法 实体类进行分页实...
VS2013调试X64平台时出现MSVSMON.EXE failed to start的问题
1.问题 vs2013突然有一天调试X64平台程序时出现“Visual Studio Remote Debugging Monitor(MSVSMON.EXE)failed to start”的问题,如下图所示。如果切换为X86平台可以编译通过。网上搜了好多方法都没有解决问题。 ...
