C/C++遍历文件和目录

C/C++遍历文件夹要用到_finddata_t结构体,函数_findfirst、_findnext和_fineclose,它们都定义在头文件<io.h>中,下面介绍具体如何使用。

 

结构体_finddata_t是用来存储文件各种信息的,其中成员变量分别为

Unsigned atrrib:文件属性的存储位置,它存储一个unsigned单元,用于表示文件的属性。文件属性是用位表示的,主要有以下一些:_A_ARCH(存档)、_A_HIDDEN(隐 藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、_A_SUBDIR(文件夹)、_A_SYSTEM(系统)。这些都是 在<io.h>中定义的宏,可以直接使用,而本身的意义其实是一个无符号整型(只不过这个整型应该是2的几次幂,从而保证只有一位为1,而其 他位为0)。既然是位表示,那么当一个文件有多个属性时,它往往是通过位或的方式,来得到几个属性的综合。例如只读+隐藏+系统属性,应该 为:_A_HIDDEN| _A_RDONLY |_A_SYSTEM 。

time_t time_create:存储文件创建的时间。

time_t time_access:存储文件最后一次被访问的时间。

time_t time_write:存储文件最后一次被修改的时间。

_fsize_t size:存储文件的大小。

char name[_MAX_FNAME]:存储文件的文件名。

 

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 <io.h>  
    #include <stdlib.h>   //包含system()函数  
    #include <string>  
      
    using namespace std;  
      
    const char *to_search = "F:\\fna\\*.fna";  //欲查找的文件,支持通配符*  
      
    int main()  
    {  
        long handle;  //用于查找的句柄  
        string str, filename;      
        _finddata_t fileinto;   //文件信息的结构体  
        handle = _findfirst(to_search, &fileinto);  //第一次查找文件  
        if(-1 == handle)  
            return -1;  
        cout << fileinto.name << endl;   //输出查找到的文件名  
        str = fileinto.name;  
        str = "F:\\prodigal.exe -f sco -i F:\\fna\\" + str + " -o F:\\text.txt";   //命令行命令字符串  
        system(str.c_str());  //调用命令行命令  
      
        while(!_findnext(handle, &fileinto))  //循环查找其它的文件,直到找完文件为止  
        {  
            cout << fileinto.name << endl;   //输出查找到的文件名  
            str = fileinto.name;  
            str = "F:\\prodigal.exe -f sco -i F:\\fna\\" + str + " -o F:\\text.txt";  
            system(str.c_str());  
        }  
        _findclose(handle);   //关闭句柄  
        return 0;  
    }  


另外一种遍历文件的方法,用windows.h头文件,供参考,下面是别人的源代码,

 

    #include<windows.h>  
    #include<iostream>  
    #include<string>  
    using namespace std;  
      
    //只能处理目录:lpPath只能是路径  
    void find(char *lpPath)  
    {  
        char szFind[MAX_PATH];  
       char szFile[MAX_PATH];  
      
        WIN32_FIND_DATA FindFileData;  
      
        strcpy(szFind,lpPath);  
        strcat(szFind,"//*.*");  
      
        HANDLE hFind=::FindFirstFile(szFind,&FindFileData);  
        if(INVALID_HANDLE_VALUE == hFind)    return;  
        while(TRUE)  
        {  
            if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)  
            {  
                if(FindFileData.cFileName[0]!='.')  
                {  
                    strcpy(szFile,lpPath);  
                    strcat(szFile,"//");  
                    strcat(szFile,FindFileData.cFileName);  
                    find(szFile);  
                }  
            }  
            else  
            {        
                   cout<<FindFileData.cFileName<<endl;  
            }  
            if(!FindNextFile(hFind,&FindFileData))  
                break;  
        }  
        FindClose(hFind);   
    }  
    //可同时处理目录和文件:path可以是路径,也可以是文件名,或者文件通配符  
    void _find(string path){   
         //取路径名最后一个"//"之前的部分,包括"//"  
        string prefix=path.substr(0,path.find_last_of('//')+1);  
      
        WIN32_FIND_DATA FindFileData;  
        HANDLE hFind=::FindFirstFile(path.c_str(), &FindFileData);  
        if(INVALID_HANDLE_VALUE == hFind)  
        {  
           cout<<"文件通配符错误"<<endl;  
          return;  
       }  
        while(TRUE)  
        {  
          //目录  
            if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)  
            {  
                //不是当前目录,也不是父目录  
                if(FindFileData.cFileName[0]!='.')  
                {  
                    //查找下一级目录  
                    _find(prefix+FindFileData.cFileName+"//"+"*.*");  
                }  
            }  
            //文件  
            else  
            {     
                 cout<<FindFileData.cFileName<<endl;  
            }  
            if(!FindNextFile(hFind,&FindFileData))  
                  break;  
        }  
        FindClose(hFind);   
    }  
      
    void main(){  
        //find("E:");//目录:E盘  
        //_find("E://*.*");//E盘下所有文件  
      
        string str="./test"; //这里指定的是目录  
      
        //string path;  
        //cout<<"请输入文件通配符:"<<flush;  
        //cin>>path;  
        // str=str+path;  
        find((char*)str.c_str());//可以处理".",".." 不可以处理"*","..//*"   
        //_find(str);//可以处理"*","..//*" 不可以处理".",".."  
        system("pause");  
    }  
    复制代码  
      
    其中有个结构体,它是C++自带的,是这样的:  
       
    typedef struct _WIN32_FIND_DATA{  
      
       DWORD dwFileAttributes; // 文件属性  
       FILETIME ftCreationTime; // 文件创建时间  
       FILETIME ftLastAccessTime; // 文件最后一次访问时间  
       FILETIME ftLastWriteTime; // 文件最后一次修改时间  
       DWORD nFileSizeHigh; // 文件长度高 32 位  
       DWORD nFileSizeLow; // 文件长度低 32 位  
       DWORD dwReserved0; // 系统保留  
       DWORD dwReserved1; // 系统保留  
       TCHAR cFileName[ MAX_PATH ]; // 长文件名  
       TCHAR cAlternateFileName[ 14 ]; // 文件的可选名  
      
    } WIN32_FIND_DATA;  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值