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

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

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

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

文章插图
 
首先需要说明的是,本文代码只能实现对某一文件夹下的文件进行遍历并筛选;如果是当前文件夹下的子文件夹中的文件,这一代码是没有办法遍历的 。大家如果有相关需求的话,可以尝试在本文代码中加几个判断语句来实现;或者参考Python将HDF格式栅格文件批量转换为TIFF格式、Python自动获取文件夹中文件数量与其所含子文件夹中的文件数量这两篇文章,基于其中提到的方法用Python代码来实现 。
本文分为两部分,第一部分为代码的分段讲解,第二部分为完整代码 。
1 分段代码介绍1.1 代码准备
这一部分主要是代码的头文件、命名空间与我们自行撰写的自定义函数get_need_File()的声明;具体代码如下所示 。
【C++遍历文件夹筛选出指定格式的文件或具有特定名称的文件】#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,就是相当于先暂时随便给它赋一个肯定不对的数值,之后程序会自动替换 。


推荐阅读