基于委托机制的(目录)文件遍历

这个示例程序基本实现了Dir命令的行为,但是是使用了ObjectiveC的委托机制,思想是不错的,共享之

需要的用到可以直接拿来用,因为委托机制真的很不错
  1. //  
  2. // 文件名:EnumFile.h  
  3. // 工程名:EnumFile  
  4. // 作  者:ccnyou   
  5. // 完成时间:2012年6月9日  
  6. //  
  7.   
  8. #ifndef EnumFile_h__  
  9. #define EnumFile_h__  
  10.   
  11. #include <stdio.h>  
  12. #include <windows.h>  
  13. #include <DIRECT.H>  
  14. #include <STRING.H>  
  15.   
  16. class EnumDirectoryDelegate  
  17. {  
  18. public:  
  19.     //发现文件夹  
  20.     virtual void DidFoundDirectory(const char *pszDirectoryName){}  
  21.     //发现文件  
  22.     virtual void DidFoundFile(const char *pszFileName){}  
  23.       
  24.     //即将进入目录  
  25.     virtual void WillEntryDirectory(const char *pszDirectoryName){}  
  26.     //已经进入目录  
  27.     virtual void DidEntryDirectory(const char *pszDirectoryName){}  
  28.     //询问是否应该进入到目录 TRUE,FALSE 忽略之  
  29.     virtual BOOL ShouldEntryDirectory(const char *pszDirectoryName) { return TRUE; }  
  30. };  
  31.   
  32.   
  33. void EnumDirectory(const char *pszPath,EnumDirectoryDelegate *pDelegate = NULL);  
  34.   
  35. #endif // EnumFile_h__  

  36. [cpp] view plaincopyprint?
  37. //  
  38. // 文件名:EnumFile.cpp  
  39. // 工程名:EnumFile  
  40. // 作  者:ccnyou   
  41. // 完成时间:2012年6月9日  
  42. //  
  43.   
  44. #include "stdafx.h"  
  45. #include "EnumFile.h"  
  46.   
  47. static BOOL IsFileNameValid(const char *pszFileName)  
  48. {  
  49.     if (strcmp(pszFileName,".") == 0)  
  50.     {  
  51.         return FALSE;  
  52.     }  
  53.   
  54.     if (strcmp(pszFileName,"..") == 0)  
  55.     {  
  56.         return FALSE;  
  57.     }  
  58.   
  59.     return TRUE;  
  60. }  
  61.   
  62. void EnumDirectory(const char *pszPath,EnumDirectoryDelegate *pDelegate/* = NULL*/)  
  63. {   
  64.     WIN32_FIND_DATA FileData;   
  65.     HANDLE          hFindFile;  
  66.     BOOL            bShouldEntryDir = TRUE;  
  67.     EnumDirectoryDelegate DefaultDelegate;  
  68.   
  69.     char szCurDir[MAX_PATH];   
  70.     char szSubDir[MAX_PATH];   
  71.   
  72.   
  73.     if (pDelegate == NULL)  
  74.     {  
  75.         pDelegate = &DefaultDelegate;  
  76.     }  
  77.   
  78.     pDelegate->DidEntryDirectory(pszPath);  
  79.   
  80.     GetCurrentDirectory(MAX_PATH,szCurDir);   
  81.     SetCurrentDirectory(pszPath);   
  82.   
  83.     hFindFile = FindFirstFile("*.*",&FileData);   
  84.     if(hFindFile!=INVALID_HANDLE_VALUE)   
  85.     {   
  86.         do  
  87.         {   
  88.             if(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)    
  89.             {  
  90.                 pDelegate->DidFoundDirectory(FileData.cFileName);  
  91.   
  92.                 if(IsFileNameValid(FileData.cFileName))   
  93.                 {   
  94.                     // 合成完整路径名   
  95.                     sprintf(szSubDir,"%s\\%s",pszPath,FileData.cFileName);  
  96.                       
  97.                     bShouldEntryDir = pDelegate->ShouldEntryDirectory(szSubDir);  
  98.                     // 递归枚举子目录   
  99.                     if (bShouldEntryDir == TRUE)  
  100.                     {  
  101.                         pDelegate->WillEntryDirectory(FileData.cFileName);  
  102.                         EnumDirectory(szSubDir,pDelegate);   
  103.                     }  
  104.                 }   
  105.             }  
  106.             else  
  107.             {  
  108.                 pDelegate->DidFoundFile(FileData.cFileName);  
  109.             }  
  110.         }while(FindNextFile(hFindFile,&FileData) != NULL);   
  111.     }   
  112.     SetCurrentDirectory(szCurDir);   
  113. }   


  114. //  
  115. // 文件名:main.cpp  
  116. // 工程名:EnumFile  
  117. // 作  者:ccnyou   
  118. // 完成时间:2012年6月9日  
  119. //  
  120.   
  121. #include "StdAfx.h"  
  122. #include <stdio.h>  
  123. #include <STDLIB.H>  
  124. #include "EnumFile.h"  
  125.   
  126. class MyDelegate : public EnumDirectoryDelegate  
  127. {  
  128. public:  
  129.       
  130.     void WillEntryDirectory(const char *pszDirectoryName)  
  131.     {  
  132.         printf("\n");  
  133.     }  
  134.       
  135.     void DidFoundDirectory(const char *pszDirectoryName)  
  136.     {  
  137.         printf("%-40s[目录]\n",pszDirectoryName);  
  138.     }  
  139.       
  140.     void DidEntryDirectory(const char *pszDirectoryName)  
  141.     {  
  142.         printf("当前目录:\n%s\n文件列表:\n",pszDirectoryName);  
  143.     }  
  144.       
  145.     void DidFoundFile(const char *pszFileName)  
  146.     {  
  147.         printf("%-40s[文件]\n",pszFileName);  
  148.     }  
  149.   
  150. //去掉注释,可以只遍历当前目录,而不进入子目录  
  151. //  BOOL ShouldEntryDirectory(const char *pszDirectoryName)  
  152. //  {  
  153. //   
  154. //      return FALSE;  
  155. //  }  
  156.   
  157. };  
  158.   
  159. int main(int argc, char* argv[])  
  160. {  
  161.     char szTestPath[MAX_PATH];  
  162.     MyDelegate Delegate;  
  163.       
  164.     GetCurrentDirectoryA(MAX_PATH,szTestPath);  
  165.     strcat(szTestPath,"\\Test");  
  166.       
  167.     printf("生成目录\n");  
  168.     CreateDirectory("Test",NULL);  
  169.     CreateDirectory("Test\\A",NULL);  
  170.     CreateDirectory("Test\\B",NULL);  
  171.       
  172.     printf("生成目录测试文件\n");  
  173.     system("echo FileA > Test\\A\\FileA1");  
  174.     system("echo FileA > Test\\A\\FileA2");  
  175.     system("echo FileA > Test\\A\\FileA3");  
  176.       
  177.     system("echo FileB > Test\\B\\FileB1");  
  178.     system("echo FileB > Test\\B\\FileB2");  
  179.     system("echo FileB > Test\\B\\FileB3");  
  180.     system("echo FileB > Test\\B\\FileB4");  
  181.       
  182.     printf("开始遍历目录...\n");  
  183.     EnumDirectory(szTestPath,&Delegate);  
  184.     printf("\n遍历目录完成\n");  
  185.       
  186.     return 0;  
  187. }  
复制代码
其中,stdafx.h 是工程自动生成的,如果需要没有生成,可以自己手工创建一个stdafx.h
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值