采用_findfirst和_findnext获取当前文件夹下以及子文件夹下特定文件

1.相关知识点:

 在实现此功能,主要使用到的函数包含,_findfirst()、_findnext()、_findclose()。通过使用上述函数以及配合结构体 _finddata_t 来达到一个遍历的效果。

  _finddata_t的结构体信息

struct _finddata64i32_t
{
    unsigned    attrib;
    __time64_t  time_create;    // -1 for FAT file systems
    __time64_t  time_access;    // -1 for FAT file systems
    __time64_t  time_write;
    _fsize_t    size;
    char        name[260];
};

借助这个博主所总结的信息:https://blog.csdn.net/xiexu911/article/details/79990774可以了解到:

其中 unsigned attribute 表示文件的属性,分别有以下几种。

_A_ARCH(存档)
_A_HIDDEN(隐藏)
_A_NORMAL(正常)
_A_RDONLY(只读)
_A_SUBDIR(文件夹)
_A_SYSTEM(系统)
time_t time_create: 
这个time_create变量是用来存储文件创建时间的,time_t 类型本质是就是一个整型。 
time_t time_access: 
文件最后一次被访问的时间。 
time_t time_write: 
文件最后一次被修改的时间。 
然后是文件大小和文件名: 
_fsize_t size: 
文件的大小。这里的_fsize_t是unsigned long类型,表示文件的字节数。

相关函数介绍

long _findfirst( char *filespec, struct _finddata_t *fileinfo );
返回值:
如果查找成功的话,将返回一个long型的唯一的查找用的句柄(就是一个唯一编号)。这个句柄将在_findnext函数中被使用。若失败,则返回-1。
参数:
filespec:标明文件的字符串,可支持通配符。比如:*.c,则表示当前文件夹下的所有后缀为C的文件。
fileinfo :这里就是用来存放文件信息的结构体的指针。这个结构体必须在调用此函数前声明,不过不用初始化,只要分配了内存空间就可以了。
函数成功后,函数会把找到的文件的信息放入这个结构体中。

int _findnext( long handle, struct _finddata_t *fileinfo );
返回值:
若成功返回0,否则返回-1。
参数:
handle:即由_findfirst函数返回回来的句柄。
fileinfo:文件信息结构体的指针。找到文件后,函数将该文件信息放入此结构体中。 

int _findclose( long handle );
返回值:成功返回0,失败返回-1。
参数: handle :_findfirst函数返回回来的句柄。 

查找特定文件(包含子文件夹下)

设计思路:

1.用_findfirst查找第一个文件,若成功则用返回的句柄调用_findnext函数查找其他的文件。

2.对查找到的文件进行判断,如果是子文件夹进行递归查找

3.查找到的为文件时,进行类型比对获取自己需要的类型进行存储

代码详细设计

#include<string>
#include<vector>
#include <io.h>
#include <ctype.h>
#define ISPATHPART(c) ((c)=='/'||(c)=='\\')

std::string GetExt(const std::string& strPathFile)
{
	if (!strPathFile.empty())
	{
		int number = 0, index = 0;
		if (isascii(strPathFile[0])&&isalpha(strPathFile[0]) && strPathFile[1] == ':')
		{
			index = 1;
			number = index + 1;
		}
		index++;
		int nlen = strPathFile.length();
		while (index<nlen)
		{
			if (ISPATHPART(strPathFile[index]))
			{
				number = index + 1;
			}
			index++;
		}

		if (number >= nlen)
		{
			return"";
		}
		int nt = 0;
		while (number<index)
		{
			index--;
			if (strPathFile[index] == '.')
			{
				nt = index;
				break;
			}
		}
		return std::string(strPathFile.c_str() + nt, nlen - nt);
	}
	return "";
}

void get_allsubdir(std::string path, std::vector<std::string>& files, std::string fileType)
{
	//在目录后面加上"\\*.*"进行第一次搜索
	std::string dir2 = path + "/*.*";

	std::vector<int> nums;
	intptr_t handle;
	_finddata_t findData;

	handle = _findfirst(dir2.c_str(), &findData);
	if (handle == -1)
	{
		//检查是否成功
		printf("can not found the file ... \n");
		return;
	}
	do
	{
		if (findData.attrib & _A_SUBDIR) //是否含有子目录
		{
			//若该子目录为"."或"..",则进行下一次循环
			if (strcmp(findData.name, ".") == 0 || strcmp(findData.name, "..") == 0)
				continue;

			// 在目录后面加上"\\"和搜索到的目录名进行下一次搜索
			std::string dirNew = path + "/" + findData.name;
			get_allsubdir(dirNew, files, fileType);

		}
		else //不是子目录,即是文件,则输出文件名和文件的大小
		{
			std::string tempPath = findData.name;
			std::string type = GetExt(tempPath);

			if (type == fileType)
			{
				std::string filePath = path + "/" + findData.name;
				files.push_back(filePath);
			}
		}
	} while (_findnext(handle, &findData) == 0);
	_findclose(handle);  // 关闭搜索句柄

	return;
}

int main()
{
	std::string path = "F:/cache/shpdata";
	std::vector<std::string> vecfiles;
	get_allsubdir(path, vecfiles,".png");
	return 0;
}

设计中,有一个获取文件类型的操作。想要了解可参考:操作字符串获取文件后缀名-CSDN博客

测试结果

查找特定文件(不包含子文件夹) 

设计思路:

和上类似,循环遍历,查找时查找对应文件。

代码详细设计

#include<string>
#include<vector>
#include <io.h>
#include <ctype.h>

void getAllFiles(std::string path, std::vector<std::string>& files, std::string fileType) {

	//文件句柄
	intptr_t hFile = 0;
	_finddata_t  fileInfo;
	std::string p;

	if ((hFile = _findfirst(p.assign(path).append("\\*" + fileType).c_str(), &fileInfo)) != -1) {
		do {
			files.push_back(p.assign(path).append("\\").append(fileInfo.name));
		} while (_findnext(hFile, &fileInfo) == 0);

		_findclose(hFile);//关闭句柄

	}

}

int main()
{
	std::string path = "F:/cache/shpdata";
	std::vector<std::string> files;
	getAllFiles(path, files, ".shp");

	return 0;
}

测试结果

参考文章

C++ 中利用 _findfirst遍历所有文件夹及文件,以及findnext win10报错解决办法_findfirstfile 遍历所有文件包括隐藏属性文件-CSDN博客

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux.小技巧快捷键

1. ctrl c 强制停止 终止某些程序的运行 也可以取消某行命令 2. ctrl d 退出或登出 进入python环境中&#xff0c;使用ctrl d 退出 3.history 查看历史使用了哪些命令 4. ! 历史最近使用的命令的开头 5.使用ctrl r 搜索历史使用的命令 按下 ctrl r 会进入 reverse -…

course-nlp——5-nn-imdb

本文参考自https://github.com/fastai/course-nlp。这部分是fastai1.0版本的教程&#xff0c;由于现在fastai2.0重构的改变非常大&#xff0c;所以文中的很多api都变了&#xff0c;由于学习目的并不是熟练掌握fastai&#xff0c;因此这里就简单的存一下&#xff0c;本文是用IMD…

2024-04-27 - AI for everyone - 第三周 - 吴恩达

摘要 2024-05-01 周三 杭州 阴 小记: (☆-v-) 2024-05-03 周四 杭州 🌤 小记: 这几天地铁好拥挤呀!不过体重已经减了 2 公斤 ,咔咔咔,继续坚持 2024-05-04 周四 杭州 🐟 小记: 因为在意,所以昨天有些事情超级不开心,但是我决定要彻底舍弃了,羁绊这种东西本就可…

探索数据结构:堆,计数,桶,基数排序的分析与模拟实现

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 堆排序 1.1. 算法思想 堆排序(Heap Sort)是一种基于堆数据结构的排…

R语言绘图 | 双Y轴截断图

教程原文&#xff1a;双Y轴截断图绘制教程 本期教程 本期教程&#xff0c;我们提供的原文的译文&#xff0c;若有需求请回复关键词&#xff1a;20240529 小杜的生信笔记&#xff0c;自2021年11月开始做的知识分享&#xff0c;主要内容是R语言绘图教程、转录组上游分析、转录组…

【kubernetes】探索k8s集群安全机制

目录 一、认证&#xff08;Authentication&#xff09; 1.1三种认证方式 1.2需要被认证的访问类型&#xff1a; 1.3安全性说明&#xff1a; 1.4证书颁发&#xff1a; 1.5kubeconfig 1.6Service Account 1.7Secret 与 SA 的关系 1.7.1Kubernetes 设计了一种资源对象叫做…

CSS 前端面试题学习笔记2

嗨&#xff0c;我是小路。今天主要和大家分享的主题是“前端CSS面试题-2”。 一、主要题目 1.画一条0.5px的直线 注意&#xff1a;浏览器默认最小像素单位为1px &#xff0c;小于1px的自动默认为1px。如果给0.5px,那么浏览器会直接显示为1px&#xff0c;只有通过sca…

ARM功耗管理架构演进及变迁

安全之安全(security)博客目录导读 目录 一、功耗管理架构演进及变迁概述 二、多核 三、big.LITTLE 四、DynamIQ 五、ARM-V9 DynamIQ 思考:从单核->多核->big.LITTLE->DynamIQ,功耗管理架构演进? 一、功耗管理架构演进及变迁概述 二、多核

基于jeecgboot-vue3的Flowable流程-待办任务(一)

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、ToDo.data.ts的数据信息如下 import {BasicColumn} from //components/Table; import {FormSchema} from //components/Table; import { rules} from //utils/helper/validator; impor…

vscode ctrl+鼠标左键无法跳转

打开设置&#xff0c;搜索intel…… 将这个智能感知改成default就可以了&#xff0c;我之前是在disable处。 分析了一下&#xff0c;其实跳转功能主要是根据上下文语法分析来实现的&#xff0c;并不是简单得全文匹配&#xff0c;因此需要相关得语法分析工具。 那么为什么默认式…

源码文章上传无忧,论坛小程序支持

前言 在数字化时代&#xff0c;知识的分享与传播显得愈发重要。为了满足广大创作者和求知者的需求&#xff0c;我们推出了全新的论坛小程序&#xff0c;不仅支持文章、源码、链接等多样化内容的上传&#xff0c;还实现了付费观看功能&#xff0c;为创作者们提供了一个展示才华…

跟TED演讲学英文:Your right to repair AI systems by Rumman Chowdhury

Your right to repair AI systems Link: https://www.ted.com/talks/rumman_chowdhury_your_right_to_repair_ai_systems Speaker: Rumman Chowdhury Date: April 2024 文章目录 Your right to repair AI systemsIntroductionVocabularySummaryTranscriptAfterword Introduct…

PbootCms微信小程序官网模版/企业官网/社交电商官网/网络工作室/软件公司官网

在数字化时代&#xff0c;企业网站已成为吸引潜在客户、提升企业形象、和扩大品牌影响力的必备工具。因此&#xff0c;一个优秀的企业网站模板显得尤为重要。 企业官网的内容框架通常都包含企业形象、产品或服务类型、信息展示等部分&#xff0c;设计师需要借助和企业形象契合…

大模型的竞争格局与产品经理的未来机遇

前 言 作为产品经理&#xff0c;很重要的一点是要紧跟技术发展的潮流。大型语言模型&#xff08;LLM&#xff09;的竞争格局日新月异&#xff0c;谁会成为最终的赢家尚未可知。在这篇博文中&#xff0c;我们将介绍我们的一些重要观察发现&#xff0c;主要涉及直接面向消费者的…

2024年华为OD机试真题-多段线数据压缩-C++-OD统一考试(C卷D卷)

2024年OD统一考试(D卷)完整题库:华为OD机试2024年最新题库(Python、JAVA、C++合集)​ 题目描述: 下图中,每个方块代表一个像素,每个像素用其行号和列号表示。 为简化处理,多段线的走向只能是水平、竖直、斜向45度。 上图中的多段线可以用下面的坐标串表示:(2, 8), (3…

T-Pot多功能蜜罐实践@debian12@FreeBSD

T-Pot介绍 T-Pot是一个集所有功能于一身的、可选择分布式的多构架&#xff08;amd64&#xff0c;arm64&#xff09;蜜罐平台&#xff0c;支持20多个蜜罐和很多可视化选项&#xff0c;使用弹性堆栈、动画实时攻击地图和许多安全工具来进一步改善欺骗体验。GitHub - telekom-sec…

Linux Kernel nf_tables 本地权限提升漏洞(CVE-2024-1086)

文章目录 前言声明一、netfilter介绍二、漏洞成因三、漏洞危害四、影响范围五、漏洞复现六、修复方案临时解决方案升级修复方案 前言 2024年1月&#xff0c;各Linux发行版官方发布漏洞公告&#xff0c;修复了一个 netfilter:nf_tables 模块中的释放后重用漏洞&#xff08;CVE-…

若尔盖草原亲子研学营 | 八月份开启

若尔盖草原亲子研学营&#xff0c;追寻父辈记忆&#xff0c;探索绿色圣境 Following the Footsteps of our Ancestors, Exploring the Maganificent Grassland . Parent -Child Summer Camp 身处繁忙的城市生活中 您是否曾在梦中追寻父亲的足迹 渴望重温他在草原上自由驰骋的…

PPINtonus (深度学习音调分析)帕金森病早期检测系统

帕金森病&#xff08;Parkinson’s Disease&#xff0c;简称PD&#xff09;是一种主要影响运动功能的进行性神经退行性疾病。这种疾病主要是由于大脑中一个名为黑质&#xff08;substantia nigra&#xff09;的区域失去产生多巴胺的神经元而引起的。PD的主要运动症状包括震颤、…

可视化数据科学平台在信贷领域应用系列三:特征组合

现代各企业都提倡“降本增效”&#xff0c;所以越来越多优秀的工具诞生了。若想在特征加工这块工作上提升效率&#xff0c;建模人员也能有更多时间“偷懒”&#xff0c;都 “Sora”时代了&#xff0c;为啥不巧用工具呢&#xff1f;RapidMiner在信贷风控特征加工组合中是一把利器…