Win32下C++遍歷目錄和文件的源碼

#include<windows.h>ios

#include<iostream>windows

#include<string>spa

using namespace std;ci

 

//只能處理目錄:lpPath只能是路徑string

void find(char *lpPath)it

{io

    char szFind[MAX_PATH];ast

   char szFile[MAX_PATH];test

 

    WIN32_FIND_DATA FindFileData;stream

 

    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;

相關文章
相關標籤/搜索