C++ 实现输出某个文件夹下所有文件名称;
利用C++实现输出某个文件夹下的文件名,需要用到的函数及其数据类型;
- 需要一个结构体,_finddata_t(头文件为:“io.h”),表示文件存储的基本信息;_finddata_t的结构体如下:
- attrib ,文件的属性;其中包含A_AECH(封存)——文件修改和声明智能通过BACKUO命令行来实现、_A_HIDDEN(隐藏)、A_RDONLY(只读)、A_NORMAL(正常)、_A_SUBDIR(子目录)、_A_SYSTEM(系统) 等属性文件
- time_create,文件创建时间;
- time_access,文件最后访问时间;时间格式以 UTC 形式存储,可以用 localtime_s 转化为 本地时间;
- 最后一次编辑时间;
- size,文件字节长度;
- name[_MAX_PATH],文件名字;
struct _finddata_t { unsigned attrib;//文件属性的存储信息,包含有 ARCH存档、HIDDEN隐藏、NORMAL正常、RDONLY只读、SUBDIR文件夹、SYSTEM系统; time_t time_create;//创建时间 time_t time_access;//最后一次访问时间 time_t time_write;//最后一次修改时间; _fsize_t size;// char name[_MAX_PATH]; }
**_findfirst(char filespec, struct _finddata_t fileinfo)
- 参数:
- finespec : 要查找文件目录;
- fileinfo:存放文件信息的指针;
- 功能:
查找满足filrspec特性的第一个文件,查找成功返回一个搜索句柄(intputr_t类型,出事之前需要定义),来标识与 finespec 相同的特性,把信息以 _finddata_t结构体 存储在fileinfo里面;查找失败则会返回-1;
备注,函数初始化时,需要定义一个 intputr_t 类型的句柄,
*_findnext(intputr_t handle, struct _finddata_t fileinfo)
参数:
handle,_findfirst 函数返回的句柄,用来标识需要查找文件的特性;
fileinfo ,与 _findfirst 函数一样;
函数功能;
查询具有 handle特性 的下一个文件,成功后返回0,否则返回-1;
_findclose(intptr_t handle)
功能:关闭搜索句柄 (handle) ,释放内存资源;函数使用须在 findfirst 和 findclose 之后;
一个字符串容器,vector,存储符合条件的文件路径;
查找文件名称时,基本流程:先定义一个句柄:handle 和一个 _finddate_t 结构体,先利用 _findfirst 函数进行查找符合条件的第一个文件,再设置一个while循环,终止条件为 _findnext 函数查找失败;查找过程中,满足条件的文件存储在定义好的容器里;最后用 _findclose 释放内存。
代码实操;
用C++查找仅子目录全部文件名;
#define MAX_PATH =80 #include<iostream> #include<vector> #include<io.h> #include<opencv2/imgproc.hpp> #include<opencv2/imgcodecs.hpp> #include<opencv2/highgui.hpp> using namespace std; using namespace cv; //遍历path目录下的所有文件 void getFiles(string path, vector<string>& files) { //文件句柄 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); files.push_back(p.assign(path).append("\\").append(fileinfo.name)); } else { files.push_back(p.assign(path).append("\\").append(fileinfo.name)); } //cout << fileinfo.name << endl; } while(_findnext(hFile, &fileinfo)==0); _findclose(hFile); } } int main() { vector<string> file; string str_22 = "E:\\ceshi"; getFiles(str_22, file); for (int i = 0; i < file.size(); i++) { cout << file[i] << endl; } return 0; }
用C++查找目录下的全部文件名;
- 与上面脚本的最大区别就是进行向里递归查找;
#define MAX_PATH =80 #include<iostream> #include<vector> #include<io.h> using namespace std; using namespace cv; //遍历path目录下的所有文件 void getFiles(string path, vector<string>& files) { //文件句柄 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); //files.push_back(p.assign(path).append("\\").append(fileinfo.name)); } else { files.push_back(p.assign(path).append("\\").append(fileinfo.name)); } //cout << fileinfo.name << endl; } while(_findnext(hFile, &fileinfo)==0); _findclose(hFile); } } int main() { vector<string> file; string str_22 = "E:\\ceshi"; getFiles(str_22, file); for (int i = 0; i < file.size(); i++) { cout << file[i] << endl; } return 0; }
用python代码实现相应功能,总的来看,python的确很简单,两行代码不到;比对于python来说,C++实现相同功能需要的时间周期会更长一点,但C++更注重底层逻辑思维的锻炼,想在计算机方面掌握更加精炼一点,建议多用用 C++ ;
- 1,导入 os 库;
- 2,利用 os.listdir(path),注:path 为需要查看的文件夹路径;
In [1]: import os In [2]: path = os.listdir('E:/ceshi') In [3]: path Out[3]: ['1', '123feiyan.xlsx', '2.png', '20200212_195634.mp4', '222', 'aaa.xlsx', 'ab.csv', 'cat', 'ceshi1', 'country_populations.mp4', 'country_populations1.mp4', 'data_mobile', 'feiyan', 'GAN_get_started', 'highcharts', 'icon', 'pandas2', 'tiranic', 'trianic']