版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}
}