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

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);
}
  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值