C/C++遍历目录下的所有文件(Windows篇)

参考:添加链接描述
参考:添加链接描述

Windows/Linux的IDE都会提供一个头文件——<io.h>,提供了类似WIN32_FIND_DATA、FindFirstFile()、FindNextFile()和FindClose()的查找文件的功能。

_finddata_t结构

_finddata_t结构用来记录查找到的文件的信息。实际上有_finddata32_t、_finddata32i64_t、_finddata64i32_t、_finddata64_t、_wfinddata32_t、_wfinddata32i64_t、_wfinddata64i32_t、_wfinddata64_t八个结构,但都只是在32位/64位整数和字符类型上有所区别,但整体上相同。大致定义如下:

struct _finddata_t
{
    unsigned attrib;
    size_t time_create;
    size_t time_access;
    size_t time_write;
    _fsize_t size;
    char name[_MAX_PATH];
};
  • attrib
    unsigned类型,文件属性。
    文件属性常量:
_A_ARCH档案。文件被BACKUP指令改变或清除时被设置。值:0x20
_A_HIDDEN隐藏。使用DIR指令一般看不到,除非使用/AH选项。值:0x02
_A_NORMAL普通。文件没有更多属性被设置,可以没有限制地被读或写。值:0x00
_A_RDONLY只读。不能以“写”为目的打开该文件,并且不能创建同名的文件。值:0x01
_A_SYSTEM系统文件。使用DIR指令一般看不见,除非使用/A或/A:S选项。值:0x04
_A_SUBDIR子目录。值:0x10
  • time_create
    _time32_t/_time64_t类型,文件创建时间(FAT文件系统为-1)。以UTC格式存储,如果需要转换成当地时间,使用localtime_s()。

  • time_access
    _time32_t/_time64_t类型,文件最后一次被访问的时间(FAT文件系统为-1)。以UTC格式存储,如果需要转换成当地时间,使用localtime_s()。

  • _time_write
    _time32_t/_time64_t类型,文件最后一次被写入的时间。以UTC格式存储,如果需要转换成当地时间,使用localtime_s()。

  • size
    _fsize_t/__int64类型,文件的长度(以字节为单位)。

  • name
    char[_MAX_PATH]/wchar_t[_MAX_PATH]类型,文件/目录名,不包含路径。

  • 对于不支持文件创建时间、文件上一次访问时间的文件系统,time_create和time_access为-1。

  • _MAX_PATH在stdlib.h中被定义为260。

  • 通配符(wildcards)
    *和?字符被用作通配符。

指定全部具有某个扩展名的文件指定所有.txt文件:"*.txt"
指定全部具有某个名称的文件/目录指定所有名为readme(格式不限)的文件和目录:“readme.*”
指定具有一定长度的扩展名的文件指定所有扩展名为4个字符,名为index的文件:“index.???”
指定具有一定长度的文件名的文件指定所有扩展名为.txt,名字含有7个字符的文件:"???.txt"

_findfirst()/_findnext()/_findclose()函数

_findfirst()函数

intptr_t _findfirst(
    const char * filespec,
    struct _finddata_t *fileinfo
);
  • filespec
    const char */const wchar_t *类型,目标文件说明(可包含通配符)。
  • fileinfo
    _finddata_t *类型,函数将会填入文件/目录信息。
  • 返回值
    如果成功,返回一个唯一的搜索句柄标识一个或一组和filespec说明匹配的文件,可以用于接下来的_findnext()和_findclose()函数。否则_findfirst()返回-1。注意,intptr_t并不是指针类型,只是int或__int64的typedef。

_findnext()函数

int _findnext(
    intptr_t handle,
    struct _finddata_t *fileinfo
);
  • handle
    intptr_t类型,搜索句柄。
  • fileinfo
    _finddata_t *类型,函数将会填入文件/目录信息。
  • 返回值
    如果成功,返回0,否则返回-1。如果没有更多能够找到的文件了,也会导致失败。

_findclose()函数

int _findclose(
    intptr_t handle
);
 
  • 关闭搜索句柄并释放相应的资源。
  • handle
    搜索句柄。
  • 返回值
    成功返回0,失败返回-1。

localtime_s()

localtime_s用来获取系统时间,运行于windows平台下
(localtime_r运行于linux平台下)

#include <iostream>
#include <time.h>
 
int main()
{
	time_t time_seconds = time(0);
	struct tm now_time;
	localtime_s(&now_time,&time_seconds);
 
	printf("%d-%d-%d %d:%d:%d\n", now_time.tm_year + 1900, now_time.tm_mon + 1,
		now_time.tm_mday, now_time.tm_hour, now_time.tm_min, now_time.tm_sec);
}

程序代码

//遍历指定位置指定后缀的文件
int listFiles(const char *dir,const char *logo,int &num )
	  //dir			:查找的目录
	  //logo			:查找的后缀名称
	  //num			:符合要求的文件个数
	  //返回值		:0代表有文件、-1代表无文件
  {
  		num = 0;
  		struct tm now_time;
		char dirNew[200];			//文件名称
		strcpy(dirNew,dir);
		strcat(dirNew,"\\");		//查找指定后缀的文件
		strcat(dirNew,logo);
		cout<<dirNew<<endl;



		intptr_t handle;
		_finddata_t findData;			//用来记录查找到的文件的信息

		handle = _findfirst(dirNew,&findData);		//查找目录的第一个文件
		if(handle == -1)
		{
			cout<<"Failed to find first file!"<<endl;
			return handle;
		}
		do
		{
			if(findData.attrib &_A_SUBDIR
				&& strcmp(findData.name,".") == 0
				&& strcmp(findData.name,"..") == 0
				)//是否是子目录并且不为“.”或者“..”
				cout<<findData.name<<"\t<dir>\n";
			else
				
			{
				num ++;
				localtime_s(&now_time,&findData.time_write);
				cout <<findData.name<<"\t"<<findData.size<<"\t"
				<<now_time.tm_year+1900<<"\t"<<now_time.tm_mon+1<<"\t"<<now_time.tm_mday<<"\t"<<now_time.tm_mday<<endl;

			}
		}while(_findnext(handle,&findData) == 0);//查找目录的下一个文件
		
		cout<<"Done!\n";
		_findclose (handle);		//关闭搜索句柄
		return 0;

  }
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值