文件查找函数

来源:互联网 发布:什么是淘宝关键词 编辑:程序博客网 时间:2024/06/07 22:56

在介绍文件查找函数之前,我们先看一下需要用到的文件信息结构体_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;}
原创粉丝点击