C++遍历文件夹下的所有文件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010128736/article/details/53021732

C++遍历文件夹下的所有文件

本人邮箱:[email protected],欢迎交流讨论,
欢迎转载,转载请注明网址http://blog.csdn.net/u010128736/


一.使用_finddata_t

  为了查找文件,我们使用

struct _finddata_t
{
    unsigned attrib;     //文件属性
    time_t time_create;  //文件创建时间
    time_t time_access;  //文件上一次访问时间
    time_t time_write;   //文件上一次修改时间
    _fsize_t size;  //文件字节数
    char name[_MAX_FNAME]; //文件名
}; 

(1)unsigned atrrib:

  文件属性。文件属性是用位表示的,主要有以下一些:_A_ARCH(存档)、_A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、_A_SUBDIR(文件夹)、_A_SYSTEM(系统)。这些都是在

(2)time_t time_create:

  这里的time_t是一个变量类型,用来存储文件创建时间的就可以了。

(3)time_t time_access:

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

(4)time_t time_write:

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

(5)_fsize_t size:

  文件的大小。这里的_fsize_t应该可以相当于unsigned整型,表示文件的字节数。

(6)char name[_MAX_FNAME]:

  文件的文件名。这里的_MAX_FNAME是一个常量宏,它在

二、_finddata_t的三个函数:

(1)_findfirst

//按FileName命名规则匹配当前目录第一个文件
_findfirst(_In_ const char * FileName, _Out_ struct _finddata64i32_t * _FindData); 

  _findfirst函数返回的是匹配到文件的句柄,很多文档将这个句柄的数据类型定为long,但有时会在_findnext的时候报错,如下图所示,就要将long类型改为intptr_t类型。遍历过程可以指定文件类型,这通过FileName的赋值来实现。

这里写图片描述

(2)_findnext

 //按FileName命名规则匹配当前目录下一个文件
_findnext(_In_ intptr_t _FindHandle, _Out_ struct _finddata64i32_t * _FindData);

(3)_findclose

 //关闭_findfirst返回的文件句柄
_findclose(_In_ intptr_t _FindHandle);

三、示例代码

#include <io.h>

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);
            }
            else
            {
                files.push_back(p.assign(path).append("\\").append(fileinfo.name));
            }
        } while (_findnext(hFile, &fileinfo) == 0);
        _findclose(hFile);
    }
}

int main(int argc, char** argv)
{   
    string filePath = ".\\720PPcalib\\front";
    vector<string> files;

    ////获取该路径下的所有文件
    getFiles(filePath, files);

    char str[30];
    int size = files.size();
    for (int i = 0; i < size; i++)
    {
        cout << files[i].c_str() << endl;
    }
}

猜你喜欢

转载自blog.csdn.net/u010128736/article/details/53021732