利用windows.h頭文件遍歷目錄

  1. #include<windows.h>    
  2. #include<iostream>    
  3. #include<string>    
  4. using namespace std;    
  5.     
  6. //只能處理目錄:lpPath只能是路徑    
  7. void find(char *lpPath)    
  8. {    
  9.     char szFind[MAX_PATH];    
  10.    char szFile[MAX_PATH];    
  11.     
  12.     WIN32_FIND_DATA FindFileData;    
  13.     
  14.     strcpy(szFind,lpPath);    
  15.     strcat(szFind,"//*.*");    
  16.     
  17.     HANDLE hFind=::FindFirstFile(szFind,&FindFileData);    
  18.     if(INVALID_HANDLE_VALUE == hFind)    return;    
  19.     while(TRUE)    
  20.     {    
  21.         if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)    
  22.         {    
  23.             if(FindFileData.cFileName[0]!='.')    
  24.             {    
  25.                 strcpy(szFile,lpPath);    
  26.                 strcat(szFile,"//");    
  27.                 strcat(szFile,FindFileData.cFileName);    
  28.                 find(szFile);    
  29.             }    
  30.         }    
  31.         else    
  32.         {          
  33.                cout<<FindFileData.cFileName<<endl;    
  34.         }    
  35.         if(!FindNextFile(hFind,&FindFileData))    
  36.             break;    
  37.     }    
  38.     FindClose(hFind);     
  39. }    
  40. //可同時處理目錄和文件:path可以是路徑,也可以是文件名,或者文件通配符    
  41. void _find(string path){     
  42.      //取路徑名最後一個"//"之前的部分,包括"//"    
  43.     string prefix=path.substr(0,path.find_last_of('//')+1);    
  44.     
  45.     WIN32_FIND_DATA FindFileData;    
  46.     HANDLE hFind=::FindFirstFile(path.c_str(), &FindFileData);    
  47.     if(INVALID_HANDLE_VALUE == hFind)    
  48.     {    
  49.        cout<<"文件通配符錯誤"<<endl;    
  50.       return;    
  51.    }    
  52.     while(TRUE)    
  53.     {    
  54.       //目錄    
  55.         if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)    
  56.         {    
  57.             //不是當前目錄,也不是父目錄    
  58.             if(FindFileData.cFileName[0]!='.')    
  59.             {    
  60.                 //查找下一級目錄    
  61.                 _find(prefix+FindFileData.cFileName+"//"+"*.*");    
  62.             }    
  63.         }    
  64.         //文件    
  65.         else    
  66.         {       
  67.              cout<<FindFileData.cFileName<<endl;    
  68.         }    
  69.         if(!FindNextFile(hFind,&FindFileData))    
  70.               break;    
  71.     }    
  72.     FindClose(hFind);     
  73. }    
  74.     
  75. void main(){    
  76.     //find("E:");//目錄:E盤    
  77.     //_find("E://*.*");//E盤下所有文件    
  78.     
  79.     string str="./test"//這裏指定的是目錄    
  80.     
  81.     //string path;    
  82.     //cout<<"請輸入文件通配符:"<<flush;    
  83.     //cin>>path;    
  84.     // str=str+path;    
  85.     find((char*)str.c_str());//可以處理".",".." 不可以處理"*","..//*"     
  86.     //_find(str);//可以處理"*","..//*" 不可以處理".",".."    
  87.     system("pause");    
  88. }    
  89. 複製代碼    
  90.     
  91. 其中有個結構體,它是C++自帶的,是這樣的:    
  92.      
  93. typedef struct _WIN32_FIND_DATA{    
  94.     
  95.    DWORD dwFileAttributes; // 文件屬性    
  96.    FILETIME ftCreationTime; // 文件創建時間    
  97.    FILETIME ftLastAccessTime; // 文件最後一次訪問時間    
  98.    FILETIME ftLastWriteTime; // 文件最後一次修改時間    
  99.    DWORD nFileSizeHigh; // 文件長度高 32 位    
  100.    DWORD nFileSizeLow; // 文件長度低 32 位    
  101.    DWORD dwReserved0; // 系統保留    
  102.    DWORD dwReserved1; // 系統保留    
  103.    TCHAR cFileName[ MAX_PATH ]; // 長文件名    
  104.    TCHAR cAlternateFileName[ 14 ]; // 文件的可選名    
  105.     
  106. } WIN32_FIND_DATA;    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章