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

来源:互联网 发布:淘宝联盟新建推广位 编辑:程序博客网 时间:2024/05/18 03:48

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

以后需要用到可以直接拿来用,因为委托机制真的很不错

//////////////////////////////////////////////////////////////////////////// 文件名:EnumFile.h// 工程名:EnumFile// 作  者:ccnyou // 完成时间:2012年6月9日// 修改时间:2012年6月12日 原因:增加UNICODE支持//////////////////////////////////////////////////////////////////////////#ifndef EnumFile_h__#define EnumFile_h__#include <stdio.h>#include <windows.h>#include <DIRECT.H>#include <STRING.H>#ifndef _T#define _T TEXT#endifclass EnumFileDelegate{public://发现文件夹virtual void DidFoundDirectory(LPCTSTR pstrDirectoryName){}//发现文件virtual void DidFoundFile(LPCTSTR pstrFileName){}//即将进入目录virtual void WillEntryDirectory(LPCTSTR pstrDirectoryName){}//已经进入目录virtual void DidEntryDirectory(LPCTSTR pstrDirectoryName){}//询问是否应该进入到目录 TRUE,FALSE 忽略之virtual BOOL ShouldEntryDirectory(LPCTSTR pstrDirectoryName) { return TRUE; }};void EnumDirectory(LPCTSTR pstrPath,EnumFileDelegate *pDelegate);#endif // EnumFile_h__

//////////////////////////////////////////////////////////////////////////// 文件名:EnumFile.cpp// 工程名:EnumFile// 作  者:ccnyou // 完成时间:2012年6月9日// 修改时间:2012年6月12日 原因:增加UNICODE支持//////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "EnumFile.h"#include <WINDOWS.H>static BOOL IsFileNameValid(LPCTSTR pstrFileName){if (lstrcmp(pstrFileName,_T(".")) == 0){return FALSE;}if (lstrcmp(pstrFileName,_T("..")) == 0){return FALSE;}return TRUE;}void EnumDirectory(LPCTSTR pstrPath,EnumFileDelegate *pDelegate){ WIN32_FIND_DATA FileData; HANDLEhFindFile;BOOLbShouldEntryDir = TRUE;TCHAR strCurDir[MAX_PATH]; TCHAR strSubDir[MAX_PATH]; pDelegate->DidEntryDirectory(pstrPath);GetCurrentDirectory(MAX_PATH,strCurDir); SetCurrentDirectory(pstrPath); hFindFile = FindFirstFile(_T("*.*"),&FileData); if(hFindFile != INVALID_HANDLE_VALUE) { do{ if(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)  {pDelegate->DidFoundDirectory(FileData.cFileName);if(IsFileNameValid(FileData.cFileName)) { // 合成完整路径名 wsprintf(strSubDir,_T("%s\\%s"),pstrPath,FileData.cFileName);bShouldEntryDir = pDelegate->ShouldEntryDirectory(strSubDir);// 递归枚举子目录 if (bShouldEntryDir == TRUE){pDelegate->WillEntryDirectory(FileData.cFileName);EnumDirectory(strSubDir,pDelegate); }} }else{pDelegate->DidFoundFile(FileData.cFileName);}}while(FindNextFile(hFindFile,&FileData) != NULL); } SetCurrentDirectory(strCurDir); } 

//////////////////////////////////////////////////////////////////////////// 文件名:main.cpp// 工程名:EnumFile// 作  者:ccnyou // 完成时间:2012年6月9日//////////////////////////////////////////////////////////////////////////#include "StdAfx.h"#include <stdio.h>#include <STDLIB.H>#include "EnumFile.h"class MyDelegate : public EnumFileDelegate{public:void WillEntryDirectory(LPCTSTR pstrDirectoryName){printf("\n");}void DidFoundDirectory(LPCTSTR pstrDirectoryName){printf("%-40s[目录]\n",pstrDirectoryName);}void DidEntryDirectory(LPCTSTR pstrDirectoryName){printf("当前目录:\n%s\n文件列表:\n",pstrDirectoryName);}void DidFoundFile(LPCTSTR pstrFileName){printf("%-40s[文件]\n",pstrFileName);}//去掉注释,可以只遍历当前目录,而不进入子目录// BOOL ShouldEntryDirectory(LPCTSTR *pstrDirectoryName)// {// // return FALSE;// }};int main(int argc, char* argv[]){char szTestPath[MAX_PATH];MyDelegate Delegate;GetCurrentDirectoryA(MAX_PATH,szTestPath);strcat(szTestPath,"\\Test");printf("生成目录\n");CreateDirectory("Test",NULL);CreateDirectory("Test\\A",NULL);CreateDirectory("Test\\B",NULL);printf("生成目录测试文件\n");system("echo FileA > Test\\A\\FileA1");system("echo FileA > Test\\A\\FileA2");system("echo FileA > Test\\A\\FileA3");system("echo FileB > Test\\B\\FileB1");system("echo FileB > Test\\B\\FileB2");system("echo FileB > Test\\B\\FileB3");system("echo FileB > Test\\B\\FileB4");printf("开始遍历目录...\n");EnumDirectory(szTestPath,&Delegate);printf("\n遍历目录完成\n");return 0;}





其中,stdafx.h 是工程自动生成的,如果需要没有生成,可以自己手工创建一个stdafx.h


原创粉丝点击