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