C++遍歷目錄下文件

轉載自:http://blog.csdn.net/abcjennifer/article/details/18147551

function:遍歷目錄下所有文件,返回文件總數,子文件夾總數(修改一下可以獲得全部文件名等)。

  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.   
  196. void main()  
  197. {  
  198.     //獲取目錄名  
  199.     char buf[256];  
  200.     printf("請輸入要統計的目錄名:");  
  201.     gets(buf);  
  202.   
  203.     //構造類對象  
  204.     CStatDir statdir;  
  205.   
  206.     //設置要遍歷的目錄  
  207.     if (!statdir.SetInitDir(buf))  
  208.     {  
  209.         puts("目錄不存在。");  
  210.         return;  
  211.     }  
  212.   
  213.     //開始遍歷  
  214.     statdir.BeginBrowse("*.*");  
  215.     printf("文件總數: %d\n子目錄總數:%d\n",statdir.GetFileCount(),statdir.GetSubdirCount());  
  216. }   

已在windows上驗證有效。

轉載自這裏


下面我加了BeginBrowseFilenames函數,以vector<char*>形式返回目錄中所有文件名。

  1.   
  1. #include "stdlib.h"  
  2. #include "direct.h"  
  3. #include "string.h"  
  4. #include "io.h"  
  5. #include "stdio.h"   
  6. #include <vector>  
  7. #include "iostream"  
  8. using namespace std;  
  9.   
  10. class CBrowseDir  
  11. {  
  12. protected:  
  13.     //存放初始目錄的絕對路徑,以'\'結尾  
  14.     char m_szInitDir[_MAX_PATH];  
  15.   
  16. public:  
  17.     //缺省構造器  
  18.     CBrowseDir();  
  19.   
  20.     //設置初始目錄爲dir,如果返回false,表示目錄不可用  
  21.     bool SetInitDir(const char *dir);  
  22.   
  23.     //開始遍歷初始目錄及其子目錄下由filespec指定類型的文件  
  24.     //filespec可以使用通配符 * ?,不能包含路徑。  
  25.     //如果返回false,表示遍歷過程被用戶中止  
  26.     bool BeginBrowse(const char *filespec);  
  27.     vector<char*> BeginBrowseFilenames(const char *filespec);  
  28.   
  29. protected:  
  30.     //遍歷目錄dir下由filespec指定的文件  
  31.     //對於子目錄,採用迭代的方法  
  32.     //如果返回false,表示中止遍歷文件  
  33.     bool BrowseDir(const char *dir,const char *filespec);  
  34.     vector<char*> GetDirFilenames(const char *dir,const char *filespec);  
  35.     //函數BrowseDir每找到一個文件,就調用ProcessFile  
  36.     //並把文件名作爲參數傳遞過去  
  37.     //如果返回false,表示中止遍歷文件  
  38.     //用戶可以覆寫該函數,加入自己的處理代碼  
  39.     virtual bool ProcessFile(const char *filename);  
  40.   
  41.     //函數BrowseDir每進入一個目錄,就調用ProcessDir  
  42.     //並把正在處理的目錄名及上一級目錄名作爲參數傳遞過去  
  43.     //如果正在處理的是初始目錄,則parentdir=NULL  
  44.     //用戶可以覆寫該函數,加入自己的處理代碼  
  45.     //比如用戶可以在這裏統計子目錄的個數  
  46.     virtual void ProcessDir(const char *currentdir,const char *parentdir);  
  47. };  
  48.   
  49. CBrowseDir::CBrowseDir()  
  50. {  
  51.     //用當前目錄初始化m_szInitDir  
  52.     getcwd(m_szInitDir,_MAX_PATH);  
  53.   
  54.     //如果目錄的最後一個字母不是'\',則在最後加上一個'\'  
  55.     int len=strlen(m_szInitDir);  
  56.     if (m_szInitDir[len-1] != '\\')  
  57.         strcat(m_szInitDir,"\\");  
  58. }  
  59.   
  60. bool CBrowseDir::SetInitDir(const char *dir)  
  61. {  
  62.     //先把dir轉換爲絕對路徑  
  63.     if (_fullpath(m_szInitDir,dir,_MAX_PATH) == NULL)  
  64.         return false;  
  65.   
  66.     //判斷目錄是否存在  
  67.     if (_chdir(m_szInitDir) != 0)  
  68.         return false;  
  69.   
  70.     //如果目錄的最後一個字母不是'\',則在最後加上一個'\'  
  71.     int len=strlen(m_szInitDir);  
  72.     if (m_szInitDir[len-1] != '\\')  
  73.         strcat(m_szInitDir,"\\");  
  74.   
  75.     return true;  
  76. }  
  77.   
  78. vector<char*> CBrowseDir::BeginBrowseFilenames(const char *filespec)  
  79. {  
  80.     ProcessDir(m_szInitDir,NULL);  
  81.     return GetDirFilenames(m_szInitDir,filespec);  
  82. }  
  83.   
  84. bool CBrowseDir::BeginBrowse(const char *filespec)  
  85. {  
  86.     ProcessDir(m_szInitDir,NULL);  
  87.     return BrowseDir(m_szInitDir,filespec);  
  88. }  
  89.   
  90. bool CBrowseDir::BrowseDir(const char *dir,const char *filespec)  
  91. {  
  92.     _chdir(dir);  
  93.   
  94.     //首先查找dir中符合要求的文件  
  95.     long hFile;  
  96.     _finddata_t fileinfo;  
  97.     if ((hFile=_findfirst(filespec,&fileinfo)) != -1)  
  98.     {  
  99.         do  
  100.         {  
  101.             //檢查是不是目錄  
  102.             //如果不是,則進行處理  
  103.             if (!(fileinfo.attrib & _A_SUBDIR))  
  104.             {  
  105.                 char filename[_MAX_PATH];  
  106.                 strcpy(filename,dir);  
  107.                 strcat(filename,fileinfo.name);  
  108.                 cout << filename << endl;  
  109.                 if (!ProcessFile(filename))  
  110.                     return false;  
  111.             }  
  112.         } while (_findnext(hFile,&fileinfo) == 0);  
  113.         _findclose(hFile);  
  114.     }  
  115.     //查找dir中的子目錄  
  116.     //因爲在處理dir中的文件時,派生類的ProcessFile有可能改變了  
  117.     //當前目錄,因此還要重新設置當前目錄爲dir。  
  118.     //執行過_findfirst後,可能系統記錄下了相關信息,因此改變目錄  
  119.     //對_findnext沒有影響。  
  120.     _chdir(dir);  
  121.     if ((hFile=_findfirst("*.*",&fileinfo)) != -1)  
  122.     {  
  123.         do  
  124.         {  
  125.             //檢查是不是目錄  
  126.             //如果是,再檢查是不是 . 或 ..   
  127.             //如果不是,進行迭代  
  128.             if ((fileinfo.attrib & _A_SUBDIR))  
  129.             {  
  130.                 if (strcmp(fileinfo.name,".") != 0 && strcmp  
  131.                     (fileinfo.name,"..") != 0)  
  132.                 {  
  133.                     char subdir[_MAX_PATH];  
  134.                     strcpy(subdir,dir);  
  135.                     strcat(subdir,fileinfo.name);  
  136.                     strcat(subdir,"\\");  
  137.                     ProcessDir(subdir,dir);  
  138.                     if (!BrowseDir(subdir,filespec))  
  139.                         return false;  
  140.                 }  
  141.             }  
  142.         } while (_findnext(hFile,&fileinfo) == 0);  
  143.         _findclose(hFile);  
  144.     }  
  145.     return true;  
  146. }  
  147.   
  148. vector<char*> CBrowseDir::GetDirFilenames(const char *dir,const char *filespec)  
  149. {  
  150.     _chdir(dir);  
  151.     vector<char*>filename_vector;  
  152.     filename_vector.clear();  
  153.   
  154.     //首先查找dir中符合要求的文件  
  155.     long hFile;  
  156.     _finddata_t fileinfo;  
  157.     if ((hFile=_findfirst(filespec,&fileinfo)) != -1)  
  158.     {  
  159.         do  
  160.         {  
  161.             //檢查是不是目錄  
  162.             //如果不是,則進行處理  
  163.             if (!(fileinfo.attrib & _A_SUBDIR))  
  164.             {  
  165.                 char filename[_MAX_PATH];  
  166.                 strcpy(filename,dir);  
  167.                 strcat(filename,fileinfo.name);  
  168.                 filename_vector.push_back(filename);  
  169.             }  
  170.         } while (_findnext(hFile,&fileinfo) == 0);  
  171.         _findclose(hFile);  
  172.     }  
  173.     //查找dir中的子目錄  
  174.     //因爲在處理dir中的文件時,派生類的ProcessFile有可能改變了  
  175.     //當前目錄,因此還要重新設置當前目錄爲dir。  
  176.     //執行過_findfirst後,可能系統記錄下了相關信息,因此改變目錄  
  177.     //對_findnext沒有影響。  
  178.     _chdir(dir);  
  179.     if ((hFile=_findfirst("*.*",&fileinfo)) != -1)  
  180.     {  
  181.         do  
  182.         {  
  183.             //檢查是不是目錄  
  184.             //如果是,再檢查是不是 . 或 ..   
  185.             //如果不是,進行迭代  
  186.             if ((fileinfo.attrib & _A_SUBDIR))  
  187.             {  
  188.                 if (strcmp(fileinfo.name,".") != 0 && strcmp  
  189.                     (fileinfo.name,"..") != 0)  
  190.                 {  
  191.                     char subdir[_MAX_PATH];  
  192.                     strcpy(subdir,dir);  
  193.                     strcat(subdir,fileinfo.name);  
  194.                     strcat(subdir,"\\");  
  195.                     ProcessDir(subdir,dir);  
  196.                     return GetDirFilenames(subdir,filespec);  
  197.                 }  
  198.             }  
  199.         } while (_findnext(hFile,&fileinfo) == 0);  
  200.         _findclose(hFile);  
  201.     }  
  202.     return filename_vector;  
  203. }  
  204.   
  205. bool CBrowseDir::ProcessFile(const char *filename)  
  206. {  
  207.     return true;  
  208. }  
  209.   
  210. void CBrowseDir::ProcessDir(const char   
  211.     *currentdir,const char *parentdir)  
  212. {  
  213. }  
  214.   
  215. //從CBrowseDir派生出的子類,用來統計目錄中的文件及子目錄個數  
  216. class CStatDir:public CBrowseDir  
  217. {  
  218. protected:  
  219.     int m_nFileCount;   //保存文件個數  
  220.     int m_nSubdirCount; //保存子目錄個數  
  221.   
  222. public:  
  223.     //缺省構造器  
  224.     CStatDir()  
  225.     {  
  226.         //初始化數據成員m_nFileCount和m_nSubdirCount  
  227.         m_nFileCount=m_nSubdirCount=0;  
  228.     }  
  229.   
  230.     //返回文件個數  
  231.     int GetFileCount()  
  232.     {  
  233.         return m_nFileCount;  
  234.     }  
  235.   
  236.     //返回子目錄個數  
  237.     int GetSubdirCount()  
  238.     {  
  239.         //因爲進入初始目錄時,也會調用函數ProcessDir,  
  240.         //所以減1後纔是真正的子目錄個數。  
  241.         return m_nSubdirCount-1;  
  242.     }  
  243.   
  244. protected:  
  245.     //覆寫虛函數ProcessFile,每調用一次,文件個數加1  
  246.     virtual bool ProcessFile(const char *filename)  
  247.     {  
  248.         m_nFileCount++;  
  249.         return CBrowseDir::ProcessFile(filename);  
  250.     }  
  251.   
  252.     //覆寫虛函數ProcessDir,每調用一次,子目錄個數加1  
  253.     virtual void ProcessDir  
  254.         (const char *currentdir,const char *parentdir)  
  255.     {  
  256.         m_nSubdirCount++;  
  257.         CBrowseDir::ProcessDir(currentdir,parentdir);  
  258.     }  
  259. };  
  260.   
  261. void main()  
  262. {  
  263.     //獲取目錄名  
  264.     char buf[256];  
  265.     printf("請輸入要統計的目錄名:");  
  266.     gets(buf);  
  267.   
  268.     //構造類對象  
  269.     CStatDir statdir;  
  270.   
  271.     //設置要遍歷的目錄  
  272.     if (!statdir.SetInitDir(buf))  
  273.     {  
  274.         puts("目錄不存在。");  
  275.         return;  
  276.     }  
  277.   
  278.     //開始遍歷  
  279.   
  280.     vector<char*>file_vec = statdir.BeginBrowseFilenames("*.*");  
  281.     printf("文件總數: %d\n",file_vec.size());  
  282. }   


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章