1. 程式人生 > >WIN32 C++ 遍歷資料夾

WIN32 C++ 遍歷資料夾

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

轉自: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

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述