您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > C/C++/C#

C++遍历文件夹筛选出指定格式的文件或具有特定名称的文件

时间:2022-11-16 10:24:33  来源:CSDN  作者:疯狂学习GIS

本文介绍基于C++语言,遍历文件夹中的全部文件,并从中获取指定类型的文件的方法。


 

首先,我们来明确一下本文所需实现的需求。现在有一个文件夹,其中包含了很多文件,如下图所示;我们如果想获取其中所有类型为.bmp格式的文件的名称,如果文件数量比较多的话,手动筛选就会很麻烦。而借助C++代码就可以简单地实现这一需求。如果需要借助Python/ target=_blank class=infotextkey>Python代码来实现同样的需求,可以参考文章ArcPy批量掩膜、批量重采样栅格遥感影像,基于其中提到的arcpy.ListRasters()函数来实现。


 

首先需要说明的是,本文代码只能实现对某一文件夹下的文件进行遍历并筛选;如果是当前文件夹下的子文件夹中的文件,这一代码是没有办法遍历的。大家如果有相关需求的话,可以尝试在本文代码中加几个判断语句来实现;或者参考Python将HDF格式栅格文件批量转换为TIFF格式、Python自动获取文件夹中文件数量与其所含子文件夹中的文件数量这两篇文章,基于其中提到的方法用Python代码来实现。

本文分为两部分,第一部分为代码的分段讲解,第二部分为完整代码。

1 分段代码介绍1.1 代码准备

这一部分主要是代码的头文件、命名空间与我们自行撰写的自定义函数get_need_File()的声明;具体代码如下所示。

#include#include#includeusing namespace std;void get_need_file(string path, vector& file, string ext);

其中,由于我们在接下来的代码中需要用到容器vector这一数据类型,因此首先需要添加#include ;同时,我们在接下来的代码中需要用到头文件io.h中的部分函数(主要都是一些与计算机系统、文件管理相关的函数),因此需要添加#include 。

接下来,这里声明了一个自定义函数get_need_file(),具体我们在本文1.3部分介绍。

1.2 主函数

这一部分介绍代码的main()函数;具体代码如下所示。

int main() {string file_path = R"(E:2_Project2_ChlorophyllProduce1_Data0_Test)";vector my_file;string need_extension = ".bmp";get_need_file(file_path, my_file, need_extension);for (int i = 0; i < my_file.size(); i++)cout << "File " << i+1 << " is:" << endl;cout << my_file[i] << endl;if (my_file.size() == 0)cout << "No file can be found!" << endl;elsecout << endl << "Find " << my_file.size() << " file(s)." << endl;return 0;

首先,我们定义了几个后续代码需要用到的变量。其中,file_path是一个字符串string变量,表示我们需要进行文件遍历的文件夹路径;这里我们用R"()"取消其中路径转义字符的使用。my_file是一个容器vector变量,其中将会存储我们需要筛选出来的特定文件。need_extension是我们需要筛选出来的特定文件的格式后缀。这些变量是如何工作的,具体我们在本文1.3部分介绍。

随后,调用自定义函数get_need_file();调用完毕后,my_file中就存储了我们需要筛选出来的特定文件(如果有的话)。

最后,for循环来输出我们找到的文件名称;if判断则是输出我们最终有没有筛选出指定格式的文件,如果筛选出来的话则会输出具体筛选出的文件数量。

主函数部分整体比较简单,这里就不再赘述。

1.3 自定义函数

这一部分介绍代码的自定义函数get_need_file(),也是本文最重要的部分;具体代码如下所示。

void get_need_file(string path, vector& file, string ext)intptr_t file_handle = 0;struct _finddata_t file_info;string temp;if ((file_handle = _findfirst(temp.assign(path).Append("/*" + ext).c_str(), &file_info)) != -1)dofile.push_back(temp.assign(path).append("/").append(file_info.name));} while (_findnext(file_handle, &file_info) == 0);_findclose(file_handle);

其中,自定义函数get_need_file()的三个参数,依次就是我们在主函数中定义的三个变量。

在自定义函数get_need_file()中,我们首先定义了intptr_t类型的变量file_handle,并对其赋值为0。首先,这里的intptr_t是一种与计算机系统有关的数据类型,专门用来存放指针的地址;相较于用标准的int格式、long格式存储指针的地址,其具有更高的安全性,因此在计算机系统中通常用其存储指针的地址。其次,这里的file_handle表示文件句柄;在计算机系统中,每一个文件都有一个唯一的编号(相当于我们每一个人都有一个唯一的身份证号码),不同的文件具有不同的句柄,依据这一个句柄计算机系统就能锁定其对应的那个唯一的文件。因为文件句柄就是一个指向指针的指针,亦即指针的地址,因此我们就将其设定为intptr_t类型。此外,为其赋值为0,就是相当于先暂时随便给它赋一个肯定不对的数值,之后程序会自动替换。

接下来,我们定义一个_finddata_t类型的变量file_info。首先,这里的_finddata_t其实是一个结构体,专门用来存储计算机系统中不同文件的各类信息;而file_info就是文件的不同信息。前面我们提到,file_handle相当于我们的身份证号码,那么这里file_info相当于就是存储了我们性别、家庭住址、爱好等信息的个人信息库。

随后,我们再定义一个字符串string类型的变量temp,其用来存储临时生成的文件路径。

接下来,进入if判断语句;这里我们将其拆开来看。首先,temp.assign(path).append("/*" + ext)其实就表示我们需要筛选的特定格式的文件,在本文中即E:2_Project2_ChlorophyllProduce1_Data0_Test)/*.bmp,并将其通过.assign()函数赋给字符串temp。随后,.c_str()函数将前面赋值好的字符串temp转为标准的C语言的格式(这是因为后面操作需要保证字符串为标准的C语言格式)。随后,将转换好的C语言格式字符串作为第一个参数,带入_findfirst()函数;其第二个参数则是file_info。_findfirst()函数的功能是在当前路径下,找到与第一个参数(在这里也就是转换好的C语言格式字符串)相匹配的第一个文件;如果能找到这个文件,那么其就返回该文件的句柄,并将该文件的信息放入file_info;如果找不到这个文件,那么该函数就返回-1。因此,这里的if判断语句表示,一旦在当前路径下找到我们需要的文件,就继续进行接下来的代码;如果找不到需要的文件,那么相当于当前文件夹下就没有符合我们要求的文件。

接下来,执行do语句内部的代码。其中,temp.assign(path).append("/").append(file_info.name)就表示当前找到的文件的路径及其名称,并通过push_back()函数将其附加至vector变量file的末尾。随后,进行while语句内部代码的判断——其中,_findnext()函数其实和前面的_findfirst()函数比较类似,它的作用是按照当前_findfirst()函数中所指定的文件筛选要求,进行继续筛选(_findfirst()函数相当于是找到了第一个符合我们筛选要求的文件,而_findnext()函数就是继续找,找到下一个符合要求的文件);如果其找到了,那么就将所找到的文件的句柄与信息返回到其两个参数中,且返回一个值0;如果没有找到的话就返回-1。因此,这里while语句相当于就是判断当前路径下还有没有我们需要的文件,如果有的话就再执行do语句内部的代码(即将文件的路径放入vector变量file的末尾);如果没有的话,那么就结束前面的循环。

最后,_findclose()表示将当前句柄所表示的文件加以关闭,并将对应的文件资源释放。

2 完整代码

本文所用到的全部代码如下。

#include#include#includeusing namespace std;void get_need_file(string path, vector& file, string ext);int main() {string file_path = R"(E:2_Project2_ChlorophyllProduce1_Data0_Test)";vector my_file;string need_extension = ".bmp";get_need_file(file_path, my_file, need_extension);for (int i = 0; i < my_file.size(); i++)cout << "File " << i + 1 << " is:" << endl;cout << my_file[i] << endl;if (my_file.size() == 0)cout << "No file can be found!" << endl;elsecout << endl << "Find " << my_file.size() << " file(s)." << endl;return 0;void get_need_file(string path, vector& file, string ext)intptr_t file_handle = 0;struct _finddata_t file_info;string temp;if ((file_handle = _findfirst(temp.assign(path).append("/*" + ext).c_str(), &file_info)) != -1)dofile.push_back(temp.assign(path).append("/").append(file_info.name));} while (_findnext(file_handle, &file_info) == 0);_findclose(file_handle);

运行上述代码后,将会得到所筛选出的文件各自的名称,以及其具体数量。


 

至此,大功告成。



Tags:C++   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
本文介绍基于C++语言,遍历文件夹中的全部文件,并从中获取指定类型的文件的方法。 首先,我们来明确一下本文所需实现的需求。现在有一个文件夹,其中包含了很多文件,如下图所示;我...【详细内容】
2022-11-16  Tags: C++  点击:(0)  评论:(0)  加入收藏
作者 | 苏宓出品 | CSDN(ID:CSDNnews)如果说此前 Kotlin、Dart、Julia、Carbon 等后起之秀向老牌编程语言发起挑战进攻都是小打小闹,那么这一次 C、C++ 这几种常青藤编程语言则...【详细内容】
2022-11-15  Tags: C++  点击:(10)  评论:(0)  加入收藏
T[N]Built-in array: a fixed-size contiguously allocated sequence of N elements of type T; implicitly converts to a T*内置数组:固定大小的连续分配的T型N个元素序列;...【详细内容】
2022-11-07  Tags: C++  点击:(31)  评论:(0)  加入收藏
前几天有个后端程序员的朋友和小慕吐槽:今年大部分的时间一直在重复着「增删改查」,回顾这一年基本没啥进步,内卷严重啊,这样下去好怕被裁员啊!在现实情况中,好像大多数人都会遭遇...【详细内容】
2022-10-25  Tags: C++  点击:(19)  评论:(0)  加入收藏
经过我前面介绍的C++学习书籍、博客网站、在线视频学习网站(没有看过的同学可以到我的主页翻看),相信大家已经有一些C++基础的,有了理论,需要通过项目来提升自身技术能力,下面推荐...【详细内容】
2022-10-07  Tags: C++  点击:(66)  评论:(0)  加入收藏
微软的Windows长期霸占80%以上的市场份额,Windows视窗界面开启了全世界绝大多数人使用电脑的启蒙之旅,更为震撼的是非洲支教小伙竟然手绘office界面教孩子们学习电脑知识。 1...【详细内容】
2022-09-27  Tags: C++  点击:(39)  评论:(0)  加入收藏
编译 | 核子可乐、Tina微软 Azure CTO 向旧语言猛烈开炮,C++ 之父对此进行了辩护。微软 Azure CTO Mark Russinovich 呼吁放弃 C 和 C++ 这两门久经时间考验,被广泛应用于高性...【详细内容】
2022-09-21  Tags: C++  点击:(56)  评论:(0)  加入收藏
DevWeekly收集整理每周优质开发者内容,包括开源项目、资源工具、技术文章等方面。VS Code这几年非常受欢迎,对于大多数编程语言,只需要简单的安装解释器/编译器就可以轻松的运...【详细内容】
2022-08-06  Tags: C++  点击:(107)  评论:(0)  加入收藏
微软想通过TypeScript 革了JavaScript的命 苹果想用Swift革了Objective-C的命 JetBrains 想用Kotlin 革了Java的命 现在,Google终于要拿C++开刀了。 这个黑色圆圈中的C可不是...【详细内容】
2022-07-28  Tags: C++  点击:(71)  评论:(0)  加入收藏
作者:王森(天作)C/C++ 具有天然的跨平台特性,丰富的构建工具、Native 的性能以及成熟的社区生态,近年来移动端也越来越多的集成了一些使用 C/C++ 开发一些逻辑内聚且对性能要求...【详细内容】
2022-07-27  Tags: C++  点击:(77)  评论:(0)  加入收藏
▌简易百科推荐
本文介绍基于C++语言,遍历文件夹中的全部文件,并从中获取指定类型的文件的方法。 首先,我们来明确一下本文所需实现的需求。现在有一个文件夹,其中包含了很多文件,如下图所示;我...【详细内容】
2022-11-16  疯狂学习GIS  CSDN  Tags:C++   点击:(0)  评论:(0)  加入收藏
在Linux开发环境上学习C语言,对于一个从零开始学习嵌入式的门外汉来说,是一个很好的选择,学习了C语言,又熟悉了Linux 操作系统。1. 开发工具下载及安装:虚拟机 VMware 10下载地址...【详细内容】
2022-11-10  嵌入式er  知乎  Tags:C语言   点击:(7)  评论:(0)  加入收藏
T[N]Built-in array: a fixed-size contiguously allocated sequence of N elements of type T; implicitly converts to a T*内置数组:固定大小的连续分配的T型N个元素序列;...【详细内容】
2022-11-07  小智雅汇  今日头条  Tags:C++   点击:(31)  评论:(0)  加入收藏
前言map 是有序的键值对容器,元素的键是唯一的,值允许重复。用比较函数 Compare 排序键。搜索、移除和插入操作拥有对数复杂度,即O(logn)。底层实现为红黑树。Map定义需要包含...【详细内容】
2022-11-07  君匡  今日头条  Tags:Cpp   点击:(9)  评论:(0)  加入收藏
前几天有个后端程序员的朋友和小慕吐槽:今年大部分的时间一直在重复着「增删改查」,回顾这一年基本没啥进步,内卷严重啊,这样下去好怕被裁员啊!在现实情况中,好像大多数人都会遭遇...【详细内容】
2022-10-25  慕课网  今日头条  Tags:C++   点击:(19)  评论:(0)  加入收藏
“协程”(coroutine),就是把Linux epoll的异步IO机制通过长跳转(long jmp)封装起来,形成一个在用户看来“连续的”流程。所有操作系统的异步IO,都分为启动函数和回调函数。以Linux...【详细内容】
2022-10-08  底层技术栈  今日头条  Tags:C语言   点击:(43)  评论:(0)  加入收藏
经过我前面介绍的C++学习书籍、博客网站、在线视频学习网站(没有看过的同学可以到我的主页翻看),相信大家已经有一些C++基础的,有了理论,需要通过项目来提升自身技术能力,下面推荐...【详细内容】
2022-10-07  程序员柠檬橙  今日头条  Tags:C++   点击:(66)  评论:(0)  加入收藏
微软的Windows长期霸占80%以上的市场份额,Windows视窗界面开启了全世界绝大多数人使用电脑的启蒙之旅,更为震撼的是非洲支教小伙竟然手绘office界面教孩子们学习电脑知识。 1...【详细内容】
2022-09-27  汇聚魔杖  今日头条  Tags:C++   点击:(39)  评论:(0)  加入收藏
上升沿和下降沿在我们开发上位机时使用率非常高,常见于消息触发、脉冲归档等。但是在C#中没有类似PLC中的上升沿、下降沿那样的指令,需要我们自己编码来实现。首先我们创建一...【详细内容】
2022-09-27  HwLib  今日头条  Tags:C#   点击:(160)  评论:(0)  加入收藏
很多人会有一个疑问C语言编译器为什么能够用C语言编写?今天就来带大家一探究竟!所谓C语言编译器,就是把编程得到的件,比如.c,.h的件,进行读取,并对内容进行分析,按照C语言的规则,将...【详细内容】
2022-09-25  互联共商     Tags:C语言   点击:(46)  评论:(0)  加入收藏
站内最新
站内热门
站内头条