VC下遍历文件夹和文件

    xiaoxiao2025-01-07  11

    一、先介绍一个结构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结构中去:

    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参数指定的文件名相符的所有文件

     

    四、下面是遍历代码

    #include<windows.h> #include<iostream> #include<string> using namespace std;

    //只能处理目录:lpPath只能是路径

     

     

    find(char * lpPath) { char szFind[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; } if(!FindNextFile(hFind,&FindFileData))break; } FindClose(hFind); }

    1.使用网上最普通的方法 find(char * lpPath) {   char szFind[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;     }     if(!FindNextFile(hFind,&FindFileData))  break;   }   FindClose(hFind); } 2.利用CFileFind类较简洁的实现该功能 void CModelDlg::FindBmpFile(CString strFoldername) {     CString m_cstrFileList="";     CFileFind tempFind;     BOOL bFound; //判断是否成功找到文件     bFound=tempFind.FindFile(strFoldername   +   "\\*.*");   /修改" "内内容给限定查找文件类型     CString strTmp;   //如果找到的是文件夹 存放文件夹路径     while(bFound)      //遍历所有文件     {         bFound=tempFind.FindNextFile(); //第一次执行FindNextFile是选择到第一个文件,以后执行为选择                                                               //到下一个文件            if(!tempFind.IsDots()) continue; //如果找到的是返回上层的目录 则结束本次查找                        if(tempFind.IsDirectory())   //找到的是文件夹,则遍历该文件夹下的文件             {                 strTmp="";                 strTmp=tempFind.GetFilePath();                 FindFile(strTmp);             }             else             {                 strTmp=tempFind.GetFileName(); //保存文件名,包括后缀名                  // 在此处添加对找到文件的处理                             }     }     tempFind.Close();     return; }

    转载请注明原文地址: https://ju.6miu.com/read-1295231.html
    最新回复(0)