Win32下C++遍曆目錄和檔案的源碼

來源:互聯網
上載者:User

標籤:

#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;

Win32下C++遍曆目錄和檔案的源碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.