枚举指定路径下的制定类型文件

#pragma once

//枚举指定路径下的制定类型文件
//@LPCTSTR 文件全路径
//@pUserData 用户参数数据?
//@return 是否是用户取消
typedef BOOL (CALLBACK * LookUpFileCallBack)(LPCTSTR/*文件名称(包含全路径)*/);

#ifdef COMDLL_EXPORTS
#define COMDLL_API __declspec(dllexport)
#else
#define COMDLL_API __declspec(dllimport)
#endif

class COMDLL_API CEnumFile //导入类
{
public:

	CEnumFile(LPCTSTR lpszPath,LPCTSTR lpszFileExt, LookUpFileCallBack pCallBack);
	//回调获取文件的全路径信息
	//@lpszPath 目录名称
	//@lpszFileExt 指定的文件扩展名
	//@bRecursion 递归,循环;递归式
	//@bEnumFiles 是否迭代枚举所有文件
	//@pCallBack 回调函数,每一个文件调用一次
	//@pUserData ???用户参数
	//调用方式:CEnumFile::CEnumFile(CGlobalData::strCurrPath + _T("LNG\\"),_T(".lng"),EnumLngFile);
	CEnumFile(LPCTSTR lpszPath,LPCTSTR lpszFileExt,LookUpFileCallBack pCallBack,BOOL bRecursion/*=FALSE*/, BOOL bEnumFiles/*=TRUE*/);
public:
	~CEnumFile(void);
};
 
#include "stdafx.h"
#include "EnumFile.h"
#include <windows.h>

CEnumFile::CEnumFile(LPCTSTR lpszPath,LPCTSTR lpszFileExt,LookUpFileCallBack pCallBack)
{
	::CEnumFile(lpszPath,lpszFileExt,pCallBack,FALSE,FALSE);
}
CEnumFile::CEnumFile(LPCTSTR lpPath,LPCTSTR lpszFileExt,LookUpFileCallBack pCallBack,BOOL bRecursion, BOOL bEnumFiles)
{
	static BOOL s_bUserBreak = FALSE;
	try{
		//-------------------------------------------------------------------------
		if(s_bUserBreak) return;
		int len = lstrlen(lpPath);
		if(lpPath==NULL || len<=0) return;

		//NotifySys(NRS_DO_EVENTS, 0,0);
		CString path=_T("");
		path.Format(_T("%s"),lpPath);
		//if (str.Right(1)!='\\')//一种判断
		if(path.ReverseFind('\\')!=1)//二种判断
			path.Format(path+"%s","\\");
		path.Format(path+"%s","*");

		/*char path[MAX_PATH];
		strcpy(path, (const char*)lpPath);
		if(lpPath[len-1] != '\\') 
			strcat(path, "\\");
		strcat(path, "*");*/

		WIN32_FIND_DATA fd;
		HANDLE hFindFile = FindFirstFile((LPCTSTR)path, &fd);
		if(hFindFile == INVALID_HANDLE_VALUE)
		{
			::FindClose(hFindFile); 
			return;
		}

		CString tempPath; 
		BOOL bUserReture=TRUE; 
		BOOL bIsDirectory;

		BOOL bFinish = FALSE;
		while(!bFinish)
		{
			tempPath.Format(_T("%s"),lpPath);
			if(path.ReverseFind('\\')!=1)//二种判断
				path.Format(path+"%s","\\");
			path.Format(path+"%s",fd.cFileName);

			bIsDirectory = ((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0);

			//如果是.或..
			CString s1;
			s1.Format(_T("%s"),fd.cFileName);
			if( bIsDirectory && (s1.CompareNoCase(_T("."))==0 || s1.CompareNoCase(_T(".."))==0))
			{        
				bFinish = (FindNextFile(hFindFile, &fd) == FALSE);
				continue;
			}

			if(pCallBack && bEnumFiles!=bIsDirectory)
			{
				if(lpszFileExt!=NULL)//判断,查找指定扩展名的文件
				{
					int idx=s1.ReverseFind('.');
					if (-1!=idx)
					{
						CString tmp=s1.Right(lstrlen(s1)-idx);
						if(tmp.CompareNoCase(lpszFileExt)==0)
						{
							bUserReture = pCallBack(tempPath+s1);
							if(bUserReture==FALSE)
							{
								s_bUserBreak = TRUE; 
								::FindClose(hFindFile); 
								return;
							}
						}
					}
					/*char* pdot;
					char* ch = new char[tempPath.GetLength()+1];
					//
					char szStr[MAX_PATH] = {0};
					wcstombs(szStr, tempPath, tempPath.GetLength());
					const char * p = szStr;
					//UNICODE下宽字符的CString转换为const char *  http://www.cnblogs.com/sunnyjones/archive/2009/02/24/1397529.html
					strncpy(ch, p, tempPath.GetLength()+1);
					//tempPath.GetBuffer(tempPath.GetLength()+1);
					if((pdot = strrchr(ch, '.')) && stricmp(pdot, (const char *)lpszFileExt) == 0)
					{
						bUserReture = pCallBack(tempPath);
						if(bUserReture==FALSE)
						{
							s_bUserBreak = TRUE; 
							::FindClose(hFindFile); 
							return;
						}
					}*/
				}
				else//没有限定扩展名
				{
					bUserReture = pCallBack(tempPath);
					if(bUserReture==FALSE)
					{
						s_bUserBreak = TRUE; 
						::FindClose(hFindFile); 
						return;
					}
				}
			}

			//NotifySys(NRS_DO_EVENTS, 0,0);

			if(bIsDirectory && bRecursion) //是子目录
			{
				CEnumFile(tempPath, lpszFileExt, pCallBack, bRecursion, bEnumFiles);
			}

			bFinish = (FindNextFile(hFindFile, &fd) == FALSE);
		}

		::FindClose(hFindFile);

		//-------------------------------------------------------------------------
	}catch(...)
	{ 
		ASSERT(0); 
		return; 
	}
}
CEnumFile::~CEnumFile()
{
	
}

 我的项目中,vc++下需要迭代出指定目录下指定扩展名的文件的工具类

你可能感兴趣的:(文件)