C++ 获取文件夹下的全部文件及指定文件(代码)

news2025/1/15 12:52:52

文章目录

    • 1.(C++17)获得指定目录下的所有文件(不搜索子文件夹)
    • 2.(C++11)获得指定目录下的所有文件(不搜索子文件夹)
    • 3.(C++11)获取目录下指定格式的所有文件(不搜索子文件夹)
    • 4.(C++11)给文件重命名
    • 4. 测试
      • 读取文件夹下的所有文件以及特定文件
      • 读取文件名后重命名
    • 参考文献

1.(C++17)获得指定目录下的所有文件(不搜索子文件夹)

vs2017版本可以使用C++17,但也需要设置下项目属性:右击项目 -> 属性 -> 配置属性 -> C/C++ -> 常规 -> 语言 -> 编译器语言,然后将编译器语言改为C++17。

#include <iostream>
#include <filesystem>

namespace fs = std::filesystem;

int main() {
	// 指定要遍历的文件夹路径
	fs::path folderPath = "E:\\0数据集\\archive\\data\\Lung Segmentation\\CXR_png";

	// 检查文件夹是否存在
	if (!fs::exists(folderPath) || !fs::is_directory(folderPath)) {
		std::cerr << "Folder does not exist." << std::endl;
		return 1;
	}

	// 遍历文件夹中的所有文件
	for (const auto& entry : fs::directory_iterator(folderPath)) {
		std::cout << entry.path().filename() << std::endl;
	}

	return 0;
}

在上面的代码中,首先指定要遍历的文件夹路径,然后使用fs::directory_iterator来遍历文件夹中的所有文件。对于每个文件,我们输出其文件名。
需要注意的是,以上代码需要C++17标准及以上版本的支持。如果使用的是更早的C++标准,可能需要使用其他库或方法来实现相同的功能。

2.(C++11)获得指定目录下的所有文件(不搜索子文件夹)

在win10中,使用文件遍历函数_findnext会报0xC0000005错误
原因: _findnext()第一个参数”路径句柄”,返回的类型为intptr_t(long long),如果定义为long,在win7中是没有问题,但是在win10中就要改为long long或者intptr_t

//需要包含的头文件
#include <io.h>
#include <string>
#include <vector>
#include <fstream>

void getAllFiles(string path, vector<string>& files) 
{
	// 文件句柄
	//long hFile = 0;
	intptr_t hFile = 0;
	// 文件信息
	struct _finddata_t fileinfo;  

	string p;

	if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1) {
		do {
			// 跳过当前目录和父目录
			if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
			{
				// 保存文件的全路径
				files.push_back(p.assign(path).append("\\").append(fileinfo.name));
			}
		   } while (_findnext(hFile, &fileinfo) == 0);  //寻找下一个,成功返回0,否则-1

		_findclose(hFile);
	}
}

3.(C++11)获取目录下指定格式的所有文件(不搜索子文件夹)

void getFiles(string path, vector<string>& files, const char* sType)
{
	//文件句柄
	//long hFile = 0;
	intptr_t hFile = 0;
	//文件信息
	struct _finddata_t fileinfo;
	string p;
	if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)
	{
		do
		{
			//如果是目录,迭代之
			//如果不是,加入列表
			if ((fileinfo.attrib & _A_SUBDIR))
			{
				if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
				{
					getFiles(p.assign(path).append("\\").append(fileinfo.name), files,sType);
				}
			}
			else
			{
				char* pName = fileinfo.name;
				char* pFind = strstr(pName,sType);
				if (pFind != NULL)
				{
					files.push_back(p.assign(path).append("\\").append(fileinfo.name));
				}
			}
		} while (_findnext(hFile, &fileinfo) == 0);

		_findclose(hFile);
	}
}

4.(C++11)给文件重命名

int ReplaceFileName(const string oldFileName, string ModifyBeforeFilds, string ModifyAfterFilds)
{
	//临时文件名用于字符替换
	string newFileName = oldFileName;

	int findIndex = newFileName.find(ModifyBeforeFilds, 1);
	if (findIndex != -1)
	{
		newFileName = newFileName.replace(findIndex, ModifyBeforeFilds.size(), ModifyAfterFilds);
	}

	fstream fs;
	fs.open(oldFileName.c_str());
	if (fs.fail())
	{
		cout << "文件打开失败!" << endl;
		fs.close();
		return -1;
	}
	else
	{
		fs.close();
		if (rename(oldFileName.c_str(), newFileName.c_str()) == -1)   //文件重命名
		{
			cout << "文件名修改失败!" << endl;
			return -1;
		}
		cout << oldFileName << endl;
		cout << newFileName << endl;
		return 0;
	}
}

4. 测试

读取文件夹下的所有文件以及特定文件

int main()
 {
	// 指定要遍历的文件夹路径
	string folderPath = "E:\\0数据集\\archive\\data\\Lung Segmentation";
	vector<string> temp;
	getAllFiles(folderPath, temp, ".docx");
	for (int i = 0; i < temp.size(); ++i)
	{
		cout << temp[i] << endl;
	}
	return 0;
}

在这里插入图片描述
在这里插入图片描述

读取文件名后重命名

int main() 
{
	// 指定要遍历的文件夹路径
	string folderPath = "D:\\test1";
	vector<string> temp;
	getAllFiles(folderPath, temp, ".png");

	string ModifyBeforeFilds = "CHNCXR_";               //指定修改前的字段
	string ModifyAfterFilds = "image";                  //指定修改后的字段
	for (int i = 0; i < temp.size(); ++i)
	{
		cout << temp[i] << endl;
		int ret = ReplaceFileName(temp[i], ModifyBeforeFilds, ModifyAfterFilds);
		if (ret == 0)
		{
			cout << "文件重命名完毕!" << endl;
		}
	}
	return 0;
}

重命名前的文件:

在这里插入图片描述
重命名后的文件:

在这里插入图片描述
注意:当路径存在中文时,运行多次后出错,且不能成功重命名

参考文献

[1] C++:获取指定目录下的所有文件
[2] C++选择文件夹并获得其中所有文件路径
[3] C++获取文件夹下所有文件名并重命名

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2133212.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工厂安灯系统在优化生产流程上的优势

工厂安灯系统通过可视化的方式&#xff0c;帮助工厂管理者和操作工人及时了解生产状态&#xff0c;快速响应问题&#xff0c;从而优化生产流程。 一、安灯系统实时监控与反馈 安灯系统的核心功能是实时监控生产线的状态。通过在生产现场设置灯光、显示屏等设备&#xff0c;工人…

OpenGL(四) 纹理贴图

几何模型&材质&纹理 渲染一个物体需要&#xff1a; 几何模型&#xff1a;决定了物体的形状材质&#xff1a;绝对了当灯光照到上面时的作用效果纹理&#xff1a;决定了物体的外观 纹理对象 纹理有2D的&#xff0c;有3D的。2D图像就是一张图片&#xff0c;3D图像是在…

记得忘记密码情况下如何退出苹果Apple ID

在日常使用苹果手机时&#xff0c;我们可能会遇到需要退出Apple ID的情况&#xff0c;比如更换手机、不再使用某些服务或出于安全考虑等。下面&#xff0c;我们就来详细介绍一下苹果手机如何退出Apple ID。 情况一&#xff1a;记得Apple ID密码 若是记得Apple ID密码&#xff…

3. 轴指令(omron 机器自动化控制器)——>MC_HomeWithParameterMC_Move

机器自动化控制器——第三章 轴指令 3 MC_HomeWithParameter变量▶输入变量▶输出变量 功能说明▶原点复位动作与原点复位参数的关系▶重启运动指令▶多重启动运动指令▶错误代码 MC_Move变量▶输入变量▶输出变量▶输入输出变量 功能说明▶指令详情▶重启运动指令▶多重启动运…

pytorch入门(1)——pytorch加载数据初认识

环境配置及其安装&#xff1a; 2023最新pytorch安装&#xff08;超详细版&#xff09;-CSDN博客 pytorch加载数据初认识 Dataset&#xff1a;创建可被Pytorch使用的数据集 提供一种方式获取数据及其label Dataloader&#xff1a;向模型传递数据 为网络提供不同的数据形式 …

算法_队列+宽度优先搜索---持续更新

文章目录 前言N叉树的层序遍历题目要求题目解析代码如下 二叉树最大宽度题目要求题目解析代码如下 在每个树中找最大值题目要求题目解析代码如下 二叉树的锯齿形层序遍历题目要求题目解析代码如下 前言 本文将会向你介绍有关队列宽度优先搜索的题目&#xff1a;N叉树的层序遍历…

【每日一题】LeetCode 2398.预算内的最多机器人数目(滑动窗口、数组、二分查找、前缀和、堆(优先队列))

【每日一题】LeetCode 2398.预算内的最多机器人数目&#xff08;滑动窗口、数组、二分查找、前缀和、堆&#xff08;优先队列&#xff09;&#xff09; 题目描述 给定两个整数数组 chargeTimes 和 runningCosts&#xff0c;分别代表 n 个机器人的充电时间和运行成本。再给定一…

喂料机和失重秤的区别?

喂料机和失重秤的区别&#xff1f;在硬件结构上的具体差异&#xff1a; 1. 喂料机的硬件结构 喂料机的结构比较简单&#xff0c;主要功能是传送物料&#xff0c;不涉及精确的称重系统。其硬件结构通常包括以下部分&#xff1a; 料斗&#xff1a;用于存储物料&#xff0c;物料…

cesium.js 入门到精通(7)

我们说一下相机的概念&#xff1a; 生活中的相机是一个用来拍照的设备&#xff0c;而这里的相机应该理解成一个人机交互的媒介。地图的缩放、平移、旋转&#xff0c;以及相关的鼠标操作都是由相机作为媒介来实现的。相机的位置和姿态参数决定了我们能看到的地图的样子。 可以…

centos7.9安装clamav教程

本章教程主要记录在centos7.9安装clamav过程。 ClamAV(Clam AntiVirus)是一个开源的防病毒软件工具,主要用于检测和消除恶意软件。它最初由 Tomasz Kojm 于 2001 年开发,并由 Cisco Systems 维护和支持。ClamAV 广泛应用于邮件网关、文件服务器和其他需要防病毒保护的环境中…

Linux软件包循环依赖解决 彻底删除i386架构 更新软件源

0.问题 之前为了wine和intel核显驱动加了32位的库&#xff0c;现在每次apt upgrade更新都被循环依赖弄得不堪其扰&#xff0c;apt --fix-broken install解决缺失都循环报错&#xff0c;寸步难行&#xff0c;忍无可忍、 而且一看全是i386的依赖&#xff0c;这32位我不用也罢&…

apache文件共享和访问控制

实现apache文件共享 文件共享路径 <Directory "/var/www/html"> #默认发布路径&#xff0c;功能限制 Options Indexes FollowSymLinks #indexes支持文件共享功能 AllowOverride None Require all granted </Directory> 进入到该路径下 cd…

【Java Bean Validation API】Spring3 集成 Bean 参数校验框架

Spring3 集成 Bean 参数校验框架 Java Bean Validation API 1. 依赖 Spring 版本&#xff1a;3.0.5 Java 版本&#xff1a;jdk21 检验框架依赖&#xff08;也可能不需要&#xff0c;在前面 spring 的启动依赖里就有&#xff09;&#xff1a; <!-- 自定义验证注解 -->…

【原创】java+springboot+mysql高校社团网系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

spring内置的

程序里注入了spring内置的线程池&#xff0c;但没有看到线程池相关参数配置&#xff08;corePoolSize maxPoolSize 队列大小&#xff09;&#xff0c;网上查说默认是1个线程&#xff0c;结果和生产实际看到的不一致。 从生产可以看到有8个线程在跑&#xff0c;task-1 task-8&am…

buildroot移植qt报错Info: creating stash file (补充qt添加字库)

移植qt库&#xff0c;编译文件报错Info: creating stash file /home/rbing/QT/uart/.qmake.stash Project ERROR: Unknown module(s) in QT: serialport rbingouc:~/QT/uart$ /home/rbing/linux/tool/buildroot-2022.02.9/output/host/usr/bin/qmake Info: creating stash fil…

PCI Express 体系结构导读摘录(六)

系列文章目录 PCI Express 体系结构导读摘录&#xff08;一&#xff09; PCI Express 体系结构导读摘录&#xff08;二&#xff09; PCI Express 体系结构导读摘录&#xff08;三&#xff09; PCI Express 体系结构导读摘录&#xff08;四&#xff09; PCI Express 体系结构导读…

HarmonyOS开发实战( Beta5.0)画笔调色板案例实践

鸿蒙HarmonyOS开发往期必看&#xff1a; HarmonyOS NEXT应用开发性能实践总结 最新版&#xff01;“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线&#xff01;&#xff08;从零基础入门到精通&#xff09; 介绍 本示例实现了一个网格渐变的画笔调色板&#xff0c;能够根…

Vector - VT System - 板卡_VT板卡使用介绍_01

总体介绍 在常规的车载网络测试中&#xff0c;除了我们常用的使用VN系列设备进行总线协议测试&#xff0c;大多数公司都会将协议强相关的功能测试放在了功能侧&#xff0c;但是实际上这块对于车载网络测试工程师来说也是需要去了解的&#xff0c;毕竟只有懂协议的人才能更好的测…

Python with 关键字语法糖

参考文章: Python with 关键字 | 菜鸟教程 (runoob.com)https://www.runoob.com/python3/python-with.html Python 中的 with 语句用于异常处理&#xff0c;封装了 try…except…finally 编码范式&#xff0c;提高了易用性。 with 语句使代码更清晰、更具可读性&#xff0c; 它…