C语言 Windows下遍历文件信息

使用到的API:(写的很好很详细)

https://www.cnblogs.com/wainiwann/archive/2013/05/22/3092721.html

主要思路:

切换到给定目录下,查找文件,判断是除“.”和".."文件夹,则递归进去,直到没有文件夹位置

遇到的问题:

x64系统,_int64  fr = _findfirst("*", fdata+ *r); 用 _int64类型接收,网上可以找到这个问题

具体效果图:

1.输入文件参数(VS2017下命令参数  --- 路径)

C语言 Windows下遍历文件信息_第1张图片

2、结果显示

C语言 Windows下遍历文件信息_第2张图片

3、文件路径及文件截图

C语言 Windows下遍历文件信息_第3张图片

C语言 Windows下遍历文件信息_第4张图片

4、代码函数截图

C语言 Windows下遍历文件信息_第5张图片

C语言 Windows下遍历文件信息_第6张图片

代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 

void showfname(struct _finddata_t fdata[], unsigned int r);
int getallfile(char * pwdname, struct _finddata_t fdata[],int *r);
int getfile(char * pwdname, struct _finddata_t fdata[],int *r);

int main(int argc,char *argv[])
{
	char fpwd[1024] = "";
	char pwd[1024] = "";
	strcpy(fpwd,argv[1]);
	printf("%s\n",fpwd);
//	printf("%s\n",pwd);


	struct _finddata_t fdata[100];
	
	int  r = 0;

	getallfile(fpwd, fdata,&r);
	showfname(fdata,r);
	scanf("%d");
}


/*
·showfname
	显示文件属性
·fdata  
	struct _finddata_t结构体指针,存储文件信息
·r
	数组下标(0开始)
*/
void showfname(struct _finddata_t* fdata,unsigned int r)
{
	unsigned a = 0;
	//struct _finddata32i64_t
	//{
	//	unsigned    attrib;			//文件属性
	//	__time32_t  time_create;    // -1 for FAT file systems	文件创建时间
	//	__time32_t  time_access;    // -1 for FAT file systems  文件最后一次访问时间
	//	__time32_t  time_write;		//文件最后一次修改时间
	//	__int64     size;			//文件大小
	//	char        name[260];		//文件名
	//};
	while (a<=r)
	{
		printf("%-50s", fdata[a].name);		//文件名
		printf("%-20d", fdata[a].size);		//文件大小
		printf("%-10d\n", fdata[a].attrib);	//文件权限
		a++;
	}
	
}


/*
·getfile
	显示当前路径下文件名(文件夹名 文件名 . ..)
·fdata
	struct _finddata_t结构体指针,存储文件信息
·r
	数组下标(0开始)
*/
int  getfile(char * pwdname, struct _finddata_t  fdata[],int *r)		//显示文件夹下文件名及文件夹名
{
	if (-1 == _chdir(pwdname))
	{
		printf("切换路径失败\n");
		return -1;
	}
	_int64  fr = _findfirst("*", fdata);
	if (fr == 0)
	{
		printf("find error\n");
		return -1;
	}
	while (++(*r))
	{
		if (!_findnext(fr, fdata + *r))
		{
			;
		}
		else
		{
			_findclose(fr);
			break;
		}
	}
	return *r;
}

/*
·getallfile
	显示文件夹及子文件夹下文件名(文件夹名 文件名 . ..)
·fdata
	struct _finddata_t结构体指针,存储文件信息
·r
	数组下标(0开始)
*/
int  getallfile(char * pwdname, struct _finddata_t* fdata,int* r)		//显示文件夹下及子文件夹文件名
{
	if (-1 == _chdir(pwdname))
	{
		printf("切换路径失败\n");
		return -1;
	}
	_int64  fr = _findfirst("*", fdata+ *r);
	if (fdata[*r].attrib == _A_SUBDIR && (strcmp(fdata[*r].name,".")!=0 && strcmp(fdata[*r].name, "..") != 0))		//判断是否是文件夹
	{
		getallfile(fdata[*r].name, fdata, r);
	}
	while (!_findnext(fr, fdata + (++*r)))
	{
			if (fdata[*r].attrib == _A_SUBDIR && (strcmp(fdata[*r].name, ".") != 0 && strcmp(fdata[*r].name, "..") != 0))		//判断是否是文件夹
			{
				char pwd[1024]= "";
				strcat(pwd, fdata[*r].name);
				strcat(pwd, "/");
				(*r)++;
				getallfile(pwd, fdata, r);
			}
	}
	_findclose(fr);
	--*r;				//减一,是必要的,因为循环最后一次,或者返回上级目录时,最后一个会空加一(大小增加,但是没有存储数据)
	return *r;
}

 

你可能感兴趣的:(C语言 Windows下遍历文件信息)