美文网首页
c++递归获取文件夹里的所有文件名

c++递归获取文件夹里的所有文件名

作者: 卡拉肖克_潘 | 来源:发表于2020-02-24 10:41 被阅读0次

一、使用以下的结构体和函数

1._finddata_t 的使用

包含于io.h中,

包含以下属性

unsigned atrrib:文件属性,包含:_A_ARCH(存档)、_A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、_A_SUBDIR(文件夹)、_A_SYSTEM(系统)。

time_t time_create:文件创建时间

time_t time_access:文件最后一次被访问的时间。

time_t time_write:文件最后一次被修改的时间。

_fsize_t size:文件大小

char name[_MAX_FNAME]:文件的文件名。

  1. long _findfirst( char *filespec, struct _finddata_t *fileinfo );

filespec :文件类型,如*.c,表示当前文件夹下所有后缀为c的文件

fileinfo:存放文件信息的指针,需要提前申明,分配内存空间,无需初始化,成功后,将文件信息放入此结构体。

返回值:查找成功,将返回一个句柄,在_findnext函数中使用,失败返回-1。

  1. int _findnext( long handle, struct _finddata_t *fileinfo );

成功返回0,识别返回-1。

handle:_findfirst返回的句柄

fileinfo:查找文件成功后存储文件信息

  1. int _findclose( long handle );

关闭文件句柄

二、基本步骤
使用_findfirst函数查找目录下的第一个文件,如果存在,返回句柄

使用_findnext函数不断查找下一个文件直到结束

最后使用_findclose关闭句柄

三、代码实现

#include <io.h>      
#include <string>    
#include <vector>    
#include <iostream>    
using namespace std;
//获取特定格式的文件名    
void getAllFiles(string path, vector<string>& files,string format)
{   
    intptr_t  hFile = 0;//文件句柄  64位下类型是intptr_t,32位下类型是long
    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)//文件夹名中不含"."和".."
                {
                //  files.push_back(p.assign(path).append("\\").append(fileinfo.name)); //保存文件夹名
                    getAllFiles(p.assign(path).append("\\").append(fileinfo.name), files, format); //递归遍历文件夹
                }
            }
            else
            {
                char ext[32];
                _splitpath(fileinfo.name, NULL, NULL, NULL, ext);//获取文件扩展名
                string _ext = ext;
                if(format==_ext)
                  files.push_back(p.assign(path).append("\\").append(fileinfo.name));//如果不是文件夹,储存文件名
            }
        } while (_findnext(hFile, &fileinfo) == 0);
        _findclose(hFile);
    }
}
 
int main()
{
    string filePath = "C:\\Users\\l\\Desktop\\标注图库\\qx";
    vector<string> files;
    string format = ".jpg";              //查找文件的格式
    getAllFiles(filePath, files,format);
    int size = files.size();
    for (int i = 0; i<size; i++)
    {
        cout << files[i] << endl;  //输出完整的文件路径和名称
    }
    system("pause");
    return 0;
}

参考:https://blog.csdn.net/u013749100/article/details/79664534

相关文章

网友评论

      本文标题:c++递归获取文件夹里的所有文件名

      本文链接:https://www.haomeiwen.com/subject/lgdmqhtx.html