入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

c++ 遍历目录下文件

创建时间:2015-01-06 投稿人: 浏览次数:2369

function:遍历目录下所有文件,返回文件总数,子文件夹总数(修改一下可以获得全部文件名等)。


[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. #include "stdlib.h"  
  2. #include "direct.h"  
  3. #include "string.h"  
  4. #include "io.h"  
  5. #include "stdio.h"   
  6. #include "iostream"  
  7. using namespace std;  
  8.   
  9. class CBrowseDir  
  10. {  
  11. protected:  
  12.     //存放初始目录的绝对路径,以""结尾  
  13.     char m_szInitDir[_MAX_PATH];  
  14.   
  15. public:  
  16.     //缺省构造器  
  17.     CBrowseDir();  
  18.   
  19.     //设置初始目录为dir,如果返回false,表示目录不可用  
  20.     bool SetInitDir(const char *dir);  
  21.   
  22.     //开始遍历初始目录及其子目录下由filespec指定类型的文件  
  23.     //filespec可以使用通配符 * ?,不能包含路径。  
  24.     //如果返回false,表示遍历过程被用户中止  
  25.     bool BeginBrowse(const char *filespec);  
  26.   
  27. protected:  
  28.     //遍历目录dir下由filespec指定的文件  
  29.     //对于子目录,采用迭代的方法  
  30.     //如果返回false,表示中止遍历文件  
  31.     bool BrowseDir(const char *dir,const char *filespec);  
  32.   
  33.     //函数BrowseDir每找到一个文件,就调用ProcessFile  
  34.     //并把文件名作为参数传递过去  
  35.     //如果返回false,表示中止遍历文件  
  36.     //用户可以覆写该函数,加入自己的处理代码  
  37.     virtual bool ProcessFile(const char *filename);  
  38.   
  39.     //函数BrowseDir每进入一个目录,就调用ProcessDir  
  40.     //并把正在处理的目录名及上一级目录名作为参数传递过去  
  41.     //如果正在处理的是初始目录,则parentdir=NULL  
  42.     //用户可以覆写该函数,加入自己的处理代码  
  43.     //比如用户可以在这里统计子目录的个数  
  44.     virtual void ProcessDir(const char *currentdir,const char *parentdir);  
  45. };  
  46.   
  47. CBrowseDir::CBrowseDir()  
  48. {  
  49.     //用当前目录初始化m_szInitDir  
  50.     getcwd(m_szInitDir,_MAX_PATH);  
  51.   
  52.     //如果目录的最后一个字母不是"",则在最后加上一个""  
  53.     int len=strlen(m_szInitDir);  
  54.     if (m_szInitDir[len-1] != "\")  
  55.         strcat(m_szInitDir,"\");  
  56. }  
  57.   
  58. bool CBrowseDir::SetInitDir(const char *dir)  
  59. {  
  60.     //先把dir转换为绝对路径  
  61.     if (_fullpath(m_szInitDir,dir,_MAX_PATH) == NULL)  
  62.         return false;  
  63.   
  64.     //判断目录是否存在  
  65.     if (_chdir(m_szInitDir) != 0)  
  66.         return false;  
  67.   
  68.     //如果目录的最后一个字母不是"",则在最后加上一个""  
  69.     int len=strlen(m_szInitDir);  
  70.     if (m_szInitDir[len-1] != "\")  
  71.         strcat(m_szInitDir,"\");  
  72.   
  73.     return true;  
  74. }  
  75.   
  76. bool CBrowseDir::BeginBrowse(const char *filespec)  
  77. {  
  78.     ProcessDir(m_szInitDir,NULL);  
  79.     return BrowseDir(m_szInitDir,filespec);  
  80. }  
  81.   
  82. bool CBrowseDir::BrowseDir(const char *dir,const char *filespec)  
  83. {  
  84.     _chdir(dir);  
  85.   
  86.     //首先查找dir中符合要求的文件  
  87.     long hFile;  
  88.     _finddata_t fileinfo;  
  89.     if ((hFile=_findfirst(filespec,&fileinfo)) != -1)  
  90.     {  
  91.         do  
  92.         {  
  93.             //检查是不是目录  
  94.             //如果不是,则进行处理  
  95.             if (!(fileinfo.attrib & _A_SUBDIR))  
  96.             {  
  97.                 char filename[_MAX_PATH];  
  98.                 strcpy(filename,dir);  
  99.                 strcat(filename,fileinfo.name);  
  100.                 cout << filename << endl;  
  101.                 if (!ProcessFile(filename))  
  102.                     return false;  
  103.             }  
  104.         } while (_findnext(hFile,&fileinfo) == 0);  
  105.         _findclose(hFile);  
  106.     }  
  107.     //查找dir中的子目录  
  108.     //因为在处理dir中的文件时,派生类的ProcessFile有可能改变了  
  109.     //当前目录,因此还要重新设置当前目录为dir。  
  110.     //执行过_findfirst后,可能系统记录下了相关信息,因此改变目录  
  111.     //对_findnext没有影响。  
  112.     _chdir(dir);  
  113.     if ((hFile=_findfirst("*.*",&fileinfo)) != -1)  
  114.     {  
  115.         do  
  116.         {  
  117.             //检查是不是目录  
  118.             //如果是,再检查是不是 . 或 ..   
  119.             //如果不是,进行迭代  
  120.             if ((fileinfo.attrib & _A_SUBDIR))  
  121.             {  
  122.                 if (strcmp(fileinfo.name,".") != 0 && strcmp  
  123.                     (fileinfo.name,"..") != 0)  
  124.                 {  
  125.                     char subdir[_MAX_PATH];  
  126.                     strcpy(subdir,dir);  
  127.                     strcat(subdir,fileinfo.name);  
  128.                     strcat(subdir,"\");  
  129.                     ProcessDir(subdir,dir);  
  130.                     if (!BrowseDir(subdir,filespec))  
  131.                         return false;  
  132.                 }  
  133.             }  
  134.         } while (_findnext(hFile,&fileinfo) == 0);  
  135.         _findclose(hFile);  
  136.     }  
  137.     return true;  
  138. }  
  139.   
  140. bool CBrowseDir::ProcessFile(const char *filename)  
  141. {  
  142.     return true;  
  143. }  
  144.   
  145. void CBrowseDir::ProcessDir(const char   
  146.     *currentdir,const char *parentdir)  
  147. {  
  148. }  
  149.   
  150. //从CBrowseDir派生出的子类,用来统计目录中的文件及子目录个数  
  151. class CStatDir:public CBrowseDir  
  152. {  
  153. protected:  
  154.     int m_nFileCount;   //保存文件个数  
  155.     int m_nSubdirCount; //保存子目录个数  
  156.   
  157. public:  
  158.     //缺省构造器  
  159.     CStatDir()  
  160.     {  
  161.         //初始化数据成员m_nFileCount和m_nSubdirCount  
  162.         m_nFileCount=m_nSubdirCount=0;  
  163.     }  
  164.   
  165.     //返回文件个数  
  166.     int GetFileCount()  
  167.     {  
  168.         return m_nFileCount;  
  169.     }  
  170.   
  171.     //返回子目录个数  
  172.     int GetSubdirCount()  
  173.     {  
  174.         //因为进入初始目录时,也会调用函数ProcessDir,  
  175.         //所以减1后才是真正的子目录个数。  
  176.         return m_nSubdirCount-1;  
  177.     }  
  178.   
  179. protected:  
  180.     //覆写虚函数ProcessFile,每调用一次,文件个数加1  
  181.     virtual bool ProcessFile(const char *filename)  
  182.     {  
  183.         m_nFileCount++;  
  184.         return CBrowseDir::ProcessFile(filename);  
  185.     }  
  186.   
  187.     //覆写虚函数ProcessDir,每调用一次,子目录个数加1  
  188.     virtual void ProcessDir  
  189.         (const char *currentdir,const char *parentdir)  
  190.     {  
  191.         m_nSubdirCount++;  
  192.         CBrowseDir::ProcessDir(currentdir,parentdir);  
  193.     }  
  194. };  
  195.   
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。