#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++下需要迭代出指定目录下指定扩展名的文件的工具类
分享到:
相关推荐
visual c++枚举进程和进程对应的文件路径和该进程调用的模块路径.zip
API枚举进程文件路径.rar
自动枚举指定文件下所有文件,并根据文件的修改日期进行排序,删除早期生成的超过设定文件数量的文件,保证文件夹内文件数量不会过多!
枚举系统文件类型 枚举系统文件类型 枚举系统文件类型 枚举系统文件类型 枚举系统文件类型
枚举指定目录下的所有文件,文件的类型可以用后缀名指定;可以指定枚举的最大深度,枚举到的所有文件名可以传给回调函数。没写注释,不过很简单,很容易看懂。
使用QT5进行开发指定文件夹下的所有文件!在编辑框输入指定文件夹的路径,一键清理该文件夹下所有的文件!可根据需要,修改枚举的文件类型,自定义清理该类型的所有的文件!
thinkPHP调用枚举类型,里面根据参数不同返回值不同,初步只封装了input(radio、check)、td、select等。
易语言文件枚举实例源码,文件枚举实例,枚举文件1,枚举文件2,取值,枚举文件3,枚举文件4,取变量数据地址_文本型,API枚举线程,Push,PopN,Pop0,Count,SendMessage_Str,FindFirstFileA,FindClose,FindNextFileA,...
枚举参数与对象类型进行比较,判断是否属于同一类型
演示如何操作Delphi 的枚举类型。 1. 包含源代码; 2. 包含执行程序 3. 演示如下函数如何使用:GetEnumName、GetEnumProp、GetEnumValue、SetEnumProp 4. 非常简单,一看就会。
易语言模拟枚举类型源码,模拟枚举类型,初始化枚举类型
Java枚举目录下的所有文件,列出文件名,是一个Java目录直读程序的例子,代码中定义了一个showDirContent方法,该方法实现取得目录内容,用路径实例化一个文件对象,重点:取得目录内所有文件列表,实例化一个...
VC++.net 的指定路径中搜索文件 VC++.net 的指定路径中搜索文件
该文件能枚举某个文件夹下和所有各层次子文件夹下某几种类型文件的路径名。比如enumFiles("c:\program files","exe")能枚举所有的exe文件路径名。
完整版枚举指定目录的所有子目录和文件例程.rar
易语言文件枚举搜索模块源码,文件枚举搜索模块,枚举文件,寻找文件,取回搜索结果,枚举文件_线程,寻找文件_线程,寻找文件_线程_,call,启动线程,创建进入许可证,删除进入许可证,进入许可区,退出许可区,强制结束线程,...
C# 分类枚举指定计算机的服务C# 分类枚举指定计算机的服务C# 分类枚举指定计算机的服务C# 分类枚举指定计算机的服务C# 分类枚举指定计算机的服务
易语言递归枚举所有文件源码,递归枚举所有文件,线程,枚举文件
易语言API枚举进程文件路径源码.7z
易语言使用节点枚举所有文件源码,使用节点枚举所有文件,枚举文件