前言:
由于在做老师布置的作业过程中需要用到读取文件夹下所有文件的功能,由于之前还没有用 C 语言试过,后面还是通过各种百度之后才解决掉。在这里做个记录,以后查阅方便。
分析:
1、头文件:
要实现我们浏览某文件夹下各种文件信息的功能,我们首先得引入对应的头文件:
#include <io.h>
该头文件包含用于存储文件信息的结构体和读取文件的各种操作。
2、存储文件信息的结构体:
这个存储文件信息的结构体的的代码大概如下:
struct _finddata_t{
unsigned int attrib; //记录文件属性(隐藏、文件夹、只读等)
time_t time_create; //文件创建时间
time_t time_access; //文件最后被访问时间
time_t time_write; //文件最后被修改时间
_fsile_t size; //文件大小
char name[_MAX_FNAME]; //文件名
};
PS:
- unsigned int attrib 存储的是文件的属性。整数怎么存储文件属性?因为这些文件属性是用位存储的,具体来说就是某个属性有对应的位,如果该位上是1,则这个文件带有这个属性。文件属性主要有以下一些:_A_ARCH(存档)、 _A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、_A_SUBDIR(文件夹)、_A_SYSTEM(系统)。这些都是已定义的宏,可以直接使用。既然是位表示,那么当一个文件有多个属性时,它往往是通过位或的方式,来得到几个属性的综合。例如只读+隐藏+系统属性,应该为:_A_HIDDEN | _A_RDONLY | _A_SYSTEM 。
- 其中的类型 time_t、_fsize_t 都是系统已存在的定义,例如 typedef long time_t。
3、读取文件信息函数:
读取文件列表中的第一个文件:
long _findfirst(char * filespec , struct _finddata_t * fileinfo);
返回值:
如果查找成功的话,将返回一个long型的唯一的查找用的句柄(就是一个唯一编号)。这个句柄将在_findnext函数中被使用。若失败,则返回-1。
参数:
filespec:标明文件的字符串,可支持通配符。比如:.c,则表示当前文件夹下的所有后缀为 C 的文件。./test/.txt,表示当前文件夹下的 test 文件夹下的所有后缀为 txt 文件。
fileinfo :这里就是用来存放文件信息的结构体的指针。这个结构体必须在调用此函数前声明,不过不用初始化,只要分配了内存空间就可以了。函数成功后,函数会把找到的文件的信息放入这个结构体中。
读取文件列表中的下一个文件:
int _findnext( long handle, struct _finddata_t *fileinfo );
返回值:
若成功返回0,否则返回-1。
参数:
handle:即由_findfirst函数返回回来的句柄。
fileinfo:文件信息结构体的指针。找到文件后,函数将该文件信息放入此结构体中。
关闭文件链接:
int _findclose( long handle );
返回值:
成功返回0,失败返回-1。
参数:
handle :_findfirst函数返回回来的句柄。
试一试:
分析也弄完了,不来个例子简直对不起观众:
#include <stdio.h>
#include<io.h>
int main(void)
{
//文件存储信息结构体
struct _finddata_t fileinfo;
//保存文件句柄
long fHandle;
//文件数记录器
int i = 0;
if( (fHandle=_findfirst( "./test/*.txt", &fileinfo )) == -1L )
{
printf( "当前目录下没有txt文件\n");
return 0;
}
else{
do{
i ++;
printf( "找到文件:%s,文件大小:%d\n", fileinfo.name,fileinfo.size);
}while( _findnext(fHandle,&fileinfo)==0);
}
//关闭文件
_findclose( fHandle );
printf("文件数量:%d\n",i);
return 0;
}
本博客设计到的知识面不广,这里仅作记录,大神勿喷。