C++ 文件查找 _findfirst、_findnext和_fineclose的使用

来源:互联网 发布:剑三喵太捏脸数据 编辑:程序博客网 时间:2024/05/01 00:02

C++ 文件查找

在C++中我们要如何查找文件呢?我们需要一个结构体和几个大家可能不太熟悉的函数。这些函数和结构体在的头文件中,结构体为struct _finddata_t ,函数为_findfirst、_findnext和_fineclose。具体如何使用,我会慢慢讲来~ 首先讲这个结构体吧~
_finddata_t ,这个结构体是用来存储文件各种信息的。
在io.h中有如下的宏:

#ifdef _USE_32BIT_TIME_T#define _finddata_t     _finddata32_t#define _finddatai64_t  _finddata32i64_t……#else#define _finddata_t     _finddata64i32_t#define _finddatai64_t  __finddata64_t

大致意思是根据32位还是64位,用相应的数据类型定义的变量,其中一个结构体定义如下:

struct _finddata64i32_t {        unsigned    attrib;        __time64_t  time_create;    /* -1 for FAT file systems */        __time64_t  time_access;    /* -1 for FAT file systems */        __time64_t  time_write;        _fsize_t    size;        char        name[260];};

其中各部分变量的含义如下:
unsigned atrrib
文件属性的存储位置。它存储一个unsigned单元,用于表示文件的属性。
文件属性是用位表示的,主要有以下一些:

_A_ARCH(存档)_A_HIDDEN(隐藏)_A_NORMAL(正常)_A_RDONLY(只读)_A_SUBDIR(文件夹)_A_SYSTEM(系统)

之间可以用 | 运算来组合表示一个文件的属性:
例如只读+隐藏+系统属性,应该为:_A_HIDDEN | _A_RDONLY | _A_SYSTEM 。
接着是三个表示时间的变量:
time_t time_create:
这个time_create变量是用来存储文件创建时间的,time_t 类型本质是就是一个整型。
time_t time_access:
文件最后一次被访问的时间。
time_t time_write:
文件最后一次被修改的时间。
然后是文件大小和文件名:
_fsize_t size:
文件的大小。这里的_fsize_t是unsigned long类型,表示文件的字节数。
char name[260]:
文件的文件名。

前面也说了,这个结构体是用来存储文件信息的,那么如何把一个硬盘文件的文件信息“存到”这个结构体所表示的内存空间里去呢?这就要靠_findfirst、_findnext和_fineclose三个函数的搭配使用了。 首先还是对这三个函数一一介绍一番吧……

long _findfirst( char *filespec, struct _finddata_t *fileinfo );
返回值:
如果查找成功的话,将返回一个long型的唯一的查找用的句柄(就是一个唯一编号)。这个句柄将在_findnext函数中被使用。若失败,则返回-1。
参数:
filespec:标明文件的字符串,可支持通配符。比如:*.c,则表示当前文件夹下的所有后缀为C的文件。
fileinfo :这里就是用来存放文件信息的结构体的指针。这个结构体必须在调用此函数前声明,不过不用初始化,只要分配了内存空间就可以了。
函数成功后,函数会把找到的文件的信息放入这个结构体中。

int _findnext( long handle, struct _finddata_t *fileinfo );
返回值:
若成功返回0,否则返回-1。
参数:
handle:即由_findfirst函数返回回来的句柄。
fileinfo:文件信息结构体的指针。找到文件后,函数将该文件信息放入此结构体中。

int _findclose( long handle );
返回值:成功返回0,失败返回-1。
参数: handle :_findfirst函数返回回来的句柄。
大家看到这里,估计都能猜到个大概了吧?先用_findfirst查找第一个文件,若成功则用返回的句柄调用_findnext函数查找其他的文件,当查找完毕后用,用_findclose函数结束查找。

下面给出一个查找指定目录下,文件名符合匹配的模式的文件,并逐个打印出来。

#include<iostream>#include<string>#include<io.h>using namespace std;void filesearch(string path,string mode){    struct _finddata_t filefind; //用来存储文件各种信息的结构体    if(path[path.size()-1]=='\\')        path.resize(path.size()-1);    string curr=path+"\\"+mode;//欲查找的文件,支持通配符    int done=0,handle;    handle=_findfirst(curr.c_str(),&filefind);//第一次查找    if(-1==handle)        return;    do{        if(!strcmp(filefind.name,".."))//若为上级目录,则跳过            continue;        //---------process---------------        curr=path+"\\"+filefind.name;        //if(strstr(filefind.name,mode.c_str()))        cout<<curr<<endl;        //------------------------------        if (_A_SUBDIR==filefind.attrib)            filesearch(curr,mode);//递归查找子目录    }while(!(done=_findnext(handle,&filefind)));    _findclose(handle);    //别忘了关闭句柄  }void main(){    string path,mode;    cout<<"请输入要搜的目录"<<endl;    cin>>path;    cout<<"请输入文件名模式"<<endl;    cin>>mode;    filesearch(path,mode);}
0 0
原创粉丝点击