文件查找函数

在介绍文件查找函数之前,我们先看一下需要用到的文件信息结构体_finddata_t吧,它的结构如下:

struct _finddata_t{
    unsigne   attrib;      //所查找文件的属性
    time_t    time_create; //文件的创建时间
    time_t    time_access; //文件最后一次被访问的时间
    time_t    time_write;  //文件最后被修改的时间
    _fsize_t  size;        //文件的大小
    char      name[260];   //文件名
}

其中的类型time_t 就是long类型,而_fsize_t就是unsigned long类型。

attrib所包含的文件属性有6中,分别为:_A_ARCH(存档)、_A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、 _A_SUBDIR(文件夹)、_A_SYSTEM(系统)。这些都是在头文件中定义的宏,可以直接使用,而本身的意义其实是一个无符号整型(只不过这个整型应该是2的几次幂,从而保证只有一位为1,而其他位为0)。既然是位表示,那么当一个文件有多个属性时,它往往是通过位或的方式,来得到几个属性的综合。eg:读+隐藏+系统属性,应该为:_A_HIDDEN | _A_RDONLY | _A_SYSTEM 。

文件的查找一般会用到三个函数:_ind firstz()、_findnext()、_fileclose(),下面我们看下这三个函数吧。

1、long findfirst( _In_z const char * Filename, _Out struct _finddata64i32_t * _FindData);
作用:是搜索与指定的文件名称匹配的第一个实例
参数:
_Filename:是你要查找的文件名,比如:需要查找该文件夹下的test.txt,则传入“test.txt”,如果需要查找文件夹下所有.txt文件,则传入”.txt”;同理,传入”.”是查找所有文件。
_FindData:是一个_finddata_t类型的结构体指针,它用来存放你所查找的文件信息(上面结构体中所讲的信息)。这个结构体必须在调用此函数前声明,不过不用初始化,只要分配了内存空间就可以了。
函数成功后,函数会把找到的文件的信息放入这个结构体中。
返回值:
如果查找成功的话,将返回一个long型的唯一的查找用的句柄(就是一个唯一编号)。【这个句柄将在_findnext函数中被使用】。若失败,则返回-1。

2、int findnext( _In intptr_t FindHandle, _Out struct __finddata64_t * _FindData);
功能:是搜索与指定的文件名称匹配的下一个实例
参数:
handle:_findfirst()函数的返回值(所以在是调用该函数之前需要先调用_findfirst()函数)
_FindData:与_findfirst()中一样,是一个_finddata_t类型的结构体指针,它用来存放你所查找的文件信息.
返回值:
该函数成功则返回0,否则会返回-1。

3、findclose(_In intptr_t _FindHandle);
功能:关闭_findfirst()中得到的文件句柄。
参数:
_FindHandle:findfirst()函数返回的文件句柄
返回值:
成功返回0,失败返回-1。

所以,再遍历一个文件时,它的流程大概是:先用_findfirst查找第一个文件,若成功则用返回的句柄调用_findnext函数查找其他的文件,当查找完毕后用,用_findclose函数结束查找。
下面是一个查找目录下所有文件,实现如下:

BOOL KLuaCheck::TraverseDirector(ofstream *fpDestFile, string DirctorPath)
{
    BOOL     bResult            = FALSE;
    BOOL     bResCode           = FALSE;
    struct   _finddata_t        fileinfo;
    string   sNewPath;
    string   sFileKind;
    string   sFilePath;
    long     hFile;
    int      nLen               = 0;

    if(pDestFile =NULL)
    {
        goto Exit0;
    }
    sFileKind = DirctorPath;
    sFileKind += "\\*.*";
    sNewPath = DirctorPath;

    ErrorInfo = DirctorPath;
    ErrorInfo += " is not find\n";

    if ((hFile = _findfirst(szFileKind, &fileinfo)) == -1) 
    {    //如果返回值为-1,则查找失败,退出该函数。
        goto Exit0;
    }  
    do 
    {
        DirctorPath = sNewPath;
        if (strncmp(fileinfo.name, ".", strlen(fileinfo.name)) != 0 
            & strncmp(fileinfo.name, "..", strlen(fileinfo.name)) != 0) 
        {   //判断是否为文件夹中的. 和 .. 文件夹,如果是则不打印。
            cout << fileinfo.name << endl;
        }   
    }while (_findnext(hFile,&fileinfo) == 0); //查找下一个

    bResult = TRUE;

    if (_findclose(hFile) == 0)       //判断文件句柄是否成功关闭
    {
        cout << "close file handle sucessful;" << endl;
    }
    else
    {
        cout << "close file handle fail;" << endl;
    }

Exit0:
    return bResult;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值