#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++下需要迭代出指定目录下指定扩展名的文件的工具类
分享到:
相关推荐
"PE文件判断工具"正是基于此背景而诞生的一款软件应用,它针对PE文件的特点,提供了文件类型的快速识别、文件夹内PE文件的批量枚举、文件复制转移以及记录功能。这不仅方便了日常的文件管理,更是在系统维护、安全...
使用`Directory.EnumerateFiles(dir, filenames)`遍历指定目录下的所有匹配文件。这返回一个枚举器,可以逐个处理文件,而不是一次性加载所有文件到内存,这对于处理大量文件非常有效。 4. **字符串处理**: - `...
该程序中包含了SaveToFile函数用于向指定路径写入数据,以及InfectU函数用于感染移动存储设备。 4. 设备枚举和病毒复制: 病毒通过枚举计算机系统中的所有逻辑驱动器,并检查它们的类型。如果检测到移动存储设备...
在创建数据库时,需要实例化Database对象,并对其属性进行配置,如指定文件组、数据文件的路径和名称等。这些操作都需要开发者对SMO对象模型有一定的了解和掌握。 在实际应用SMO时,开发者可能会遇到各种问题,比如...
- **fseek (设置文件位置指针)**:将文件指针移动到文件的指定位置。 - **ftell (获取文件的当前读写位置)**:获取文件指针的当前位置。 - **ferror (出错的检测)**:检测文件操作是否出错。 - **clearerr (清除错误...
- **枚举 (enum)**: 探讨 enum 类型的作用及其在程序设计中的应用。 - **更多的结构体声明 (More struct declarations)**: 深入探讨结构体的高级用法,包括嵌套结构体和联合体。 - **命令行参数 (CommandLine ...
- **可拷贝类型和可移动类型**:对于需要复制或移动的对象,应该明确指定拷贝构造函数、拷贝赋值运算符、移动构造函数以及移动赋值运算符。 - **结构体VS.类**:结构体通常用来表示简单的数据结构,而类则包含了数据...
- 返回值错误码时,应明确无误的错误枚举类型。 8. **模板与泛型编程**: - 使用模板时要谨慎,避免产生大量重复代码。 - 避免使用模板元编程,除非有明确的性能需求。 9. **并发编程**: - 使用`std::mutex`...
- 声明时指定数组的类型和名字。 - 初始化时分配内存并设置初始值。 9. **数组的使用** - 访问数组元素使用索引。 - 可以使用循环来遍历数组。 10. **分配内存空间** - 创建数组时会自动分配相应的内存空间。...
各个测试算法都被加入到TestBatch以后,batch.run()开始执行算法比较过程并输出结果Excel文件到C盘根目录(输出路径可在Testable接口中配置,除了生成Excel文件外,还可以通过修改log4j.properties在制定的位置产生...
- 向下转换是指父类引用被显式地转换为子类类型。 15. **Java的运算符** - 包括算术运算符、比较运算符、逻辑运算符、位运算符等。 16. **表达式和三目运算符** - 表达式是由变量、常量、运算符组成的式子。 -...
理解引导分区与系统分区 NTFS简介 理解NFTS分区中的多回收站 在NT中考虑FAT文件系统特征 将NT计算机移植到其他域 理解NT授予权 Windows NT安装类型简介 为3张安装盘创建备份盘 理解RISC体系结构下的Windows NT安装 ...
- **实践建议:** 在构建项目时,明确指定类路径,避免因类路径配置错误导致的编译或运行时错误。 #### 24. AWT组件使用 - **要点:** 在使用AWT组件时,注意布局管理器和其他组件的兼容性问题。 - **实践建议:** ...
- 集合在声明时应当指定模板类型(泛型),如`List<String> names`,以防止类型安全问题。 - 使用集合时,应合理设置初始容量,避免过多的扩容操作影响性能。 2. **线程管理**: - 新建线程时,通常会通过`...
- **类型转换:** 明确指定转换类型,避免隐式转换带来的潜在问题。 #### 附录一 匈牙利命名法 - **匈牙利命名法简介:** 匈牙利命名法是一种变量命名约定,其中变量名包含类型信息。虽然该规范提到使用匈牙利命名...
- `--file-read`、`--file-write`和`--file-dest`分别用于读取、写入远程文件,`--msf-path`指定Metasploit框架路径,方便利用漏洞。 10. **多线程与调试**: `-v`控制输出详细程度,从0到6递增,`--threads`允许...