这个示例程序基本实现了Dir命令的行为,但是是使用了ObjectiveC的委托机制,思想是不错的,共享之
需要的用到可以直接拿来用,因为委托机制真的很不错
复制代码
其中,stdafx.h 是工程自动生成的,如果需要没有生成,可以自己手工创建一个stdafx.h
需要的用到可以直接拿来用,因为委托机制真的很不错
- //
- // 文件名:EnumFile.h
- // 工程名:EnumFile
- // 作 者:ccnyou
- // 完成时间:2012年6月9日
- //
-
- #ifndef EnumFile_h__
- #define EnumFile_h__
-
- #include <stdio.h>
- #include <windows.h>
- #include <DIRECT.H>
- #include <STRING.H>
-
- class EnumDirectoryDelegate
- {
- public:
- //发现文件夹
- virtual void DidFoundDirectory(const char *pszDirectoryName){}
- //发现文件
- virtual void DidFoundFile(const char *pszFileName){}
-
- //即将进入目录
- virtual void WillEntryDirectory(const char *pszDirectoryName){}
- //已经进入目录
- virtual void DidEntryDirectory(const char *pszDirectoryName){}
- //询问是否应该进入到目录 TRUE,FALSE 忽略之
- virtual BOOL ShouldEntryDirectory(const char *pszDirectoryName) { return TRUE; }
- };
-
-
- void EnumDirectory(const char *pszPath,EnumDirectoryDelegate *pDelegate = NULL);
-
- #endif // EnumFile_h__
-
- [cpp] view plaincopyprint?
- //
- // 文件名:EnumFile.cpp
- // 工程名:EnumFile
- // 作 者:ccnyou
- // 完成时间:2012年6月9日
- //
-
- #include "stdafx.h"
- #include "EnumFile.h"
-
- static BOOL IsFileNameValid(const char *pszFileName)
- {
- if (strcmp(pszFileName,".") == 0)
- {
- return FALSE;
- }
-
- if (strcmp(pszFileName,"..") == 0)
- {
- return FALSE;
- }
-
- return TRUE;
- }
-
- void EnumDirectory(const char *pszPath,EnumDirectoryDelegate *pDelegate/* = NULL*/)
- {
- WIN32_FIND_DATA FileData;
- HANDLE hFindFile;
- BOOL bShouldEntryDir = TRUE;
- EnumDirectoryDelegate DefaultDelegate;
-
- char szCurDir[MAX_PATH];
- char szSubDir[MAX_PATH];
-
-
- if (pDelegate == NULL)
- {
- pDelegate = &DefaultDelegate;
- }
-
- pDelegate->DidEntryDirectory(pszPath);
-
- GetCurrentDirectory(MAX_PATH,szCurDir);
- SetCurrentDirectory(pszPath);
-
- hFindFile = FindFirstFile("*.*",&FileData);
- if(hFindFile!=INVALID_HANDLE_VALUE)
- {
- do
- {
- if(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
- {
- pDelegate->DidFoundDirectory(FileData.cFileName);
-
- if(IsFileNameValid(FileData.cFileName))
- {
- // 合成完整路径名
- sprintf(szSubDir,"%s\\%s",pszPath,FileData.cFileName);
-
- bShouldEntryDir = pDelegate->ShouldEntryDirectory(szSubDir);
- // 递归枚举子目录
- if (bShouldEntryDir == TRUE)
- {
- pDelegate->WillEntryDirectory(FileData.cFileName);
- EnumDirectory(szSubDir,pDelegate);
- }
- }
- }
- else
- {
- pDelegate->DidFoundFile(FileData.cFileName);
- }
- }while(FindNextFile(hFindFile,&FileData) != NULL);
- }
- SetCurrentDirectory(szCurDir);
- }
-
-
- //
- // 文件名:main.cpp
- // 工程名:EnumFile
- // 作 者:ccnyou
- // 完成时间:2012年6月9日
- //
-
- #include "StdAfx.h"
- #include <stdio.h>
- #include <STDLIB.H>
- #include "EnumFile.h"
-
- class MyDelegate : public EnumDirectoryDelegate
- {
- public:
-
- void WillEntryDirectory(const char *pszDirectoryName)
- {
- printf("\n");
- }
-
- void DidFoundDirectory(const char *pszDirectoryName)
- {
- printf("%-40s[目录]\n",pszDirectoryName);
- }
-
- void DidEntryDirectory(const char *pszDirectoryName)
- {
- printf("当前目录:\n%s\n文件列表:\n",pszDirectoryName);
- }
-
- void DidFoundFile(const char *pszFileName)
- {
- printf("%-40s[文件]\n",pszFileName);
- }
-
- //去掉注释,可以只遍历当前目录,而不进入子目录
- // BOOL ShouldEntryDirectory(const char *pszDirectoryName)
- // {
- //
- // 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;
- }