您的位置:首页 > 编程语言 > C语言/C++

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

2016-06-22 11:43 351 查看
转载:http://blog.csdn.net/luojiafei/article/details/7351278

[cpp]
view plain
copy

#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; 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息