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

本文介绍了一个使用Objective-C编写的示例程序,该程序通过委托机制实现了类似于Dir命令的功能,能够递归地枚举指定目录及其子目录下的所有文件和文件夹。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个示例程序基本实现了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
#endif

class 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; 
	HANDLE			hFindFile;
	BOOL			bShouldEntryDir = 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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值