Win32下C++遍历目录和文件的源码

  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; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值