WIN32 C++ 遍历文件夹

    技术2026-04-13  0

    转自:http://blog.csdn.net/lizhigang770/archive/2010/11/30/6045242.aspx

     

    一、先介绍一个结构 WIN32_FIND_DATA

    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;

    可以通过 FindFirstFile ()函数,根据文件路径把待操作文件的相关属性读取到 WIN32_FIND_DATA 结构中去:

    四、下面是遍历代码

    #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=".//";       string path;       cout<<"请输入文件通配符:"<<flush;       cin>>path;       str=str+path;       find((char*)str.c_str());//可以处理".",".." 不可以处理"*","..//*"       _find(str);//可以处理"*","..//*" 不可以处理".",".." }

    WIN32_FIND_DATA ffd;

    HANDLE hFind = FindFirstFile("c://test.dat",&ffd);

    二、函数 FindFirstFile

          1 、声明 : HANDLE FindFirstFile(LPCTSTR lpFileName,LPWIN32_FIND_DATA lpFindFileData);

    2 、参数 :

    lpFileName String ,欲搜索的文件名。可包含通配符,并可包含一个路径或相对路径名 lpFindFileData WIN32_FIND_DATA ,一个 WIN32_FIND_DATA 指针, 用于装载与找到的文件有关的信息,该结构可用于后续的搜索

    3 、返回值 :

    如执行成功,返回一个搜索句柄。如果出错,返回一个 INVALID_HANDLE_VALUE 常数,一旦不再需要,应该用 FindClose 函数关闭这个句柄

    4 、功能

    读取文件信息到一个 WIN32_FIND_DATA 结构中,返回这个文件的句柄

    5 、注释:

    由这个函数返回的句柄可以作为一个参数用于 FindNextFile 函数。这样一来,就可以方便的枚举出与 lpFileName 参数指定的文件名相符的所有文件(是指文件名含有通配符)

    三、函数 FindNextFile

    1 、声明 BOOL FindNextFile(HANDLE hFindFile, LPWIN32_FIND_DATA lpFindFileData);

    2 、参数 :

    HANDLE hFindFile 搜索的文件句柄,函数执行的时候搜索的是此句柄的下一文件

    LPWIN32_FIND_DATA lpFindFileData 一个 WIN32_FIND_DATA 指针,

    3 、返回值 :

    如果调用成功返回一个非 0 值;调用失败,返回为 0 ,可调用 GetLastError 来获取错误信息

    4 、功能

    继续查找 FindFirstFile 函数搜索后的文件

    5 、注释:

    这个函数可以连续调用,以方便的枚举出与 lpFileName 参数指定的文件名相符的所有文件

     

    其它参考文献:http://www.cnblogs.com/summerRQ/articles/2375749.html

    最新回复(0)