`
Fangrn
  • 浏览: 818443 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

    博客分类:
  • vc++
 
阅读更多
#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文件的特点,提供了文件类型的快速识别、文件夹内PE文件的批量枚举、文件复制转移以及记录功能。这不仅方便了日常的文件管理,更是在系统维护、安全...

    C#将制定目录文件名转换成大写的方法

    使用`Directory.EnumerateFiles(dir, filenames)`遍历指定目录下的所有匹配文件。这返回一个枚举器,可以逐个处理文件,而不是一次性加载所有文件到内存,这对于处理大量文件非常有效。 4. **字符串处理**: - `...

    计算机病毒案例.pdf

    该程序中包含了SaveToFile函数用于向指定路径写入数据,以及InfectU函数用于感染移动存储设备。 4. 设备枚举和病毒复制: 病毒通过枚举计算机系统中的所有逻辑驱动器,并检查它们的类型。如果检测到移动存储设备...

    SQL Server Management Objects的研究与应用.pdf

    在创建数据库时,需要实例化Database对象,并对其属性进行配置,如指定文件组、数据文件的路径和名称等。这些操作都需要开发者对SMO对象模型有一定的了解和掌握。 在实际应用SMO时,开发者可能会遇到各种问题,比如...

    嵌入式+芯片手册相关单词表

    - **fseek (设置文件位置指针)**:将文件指针移动到文件的指定位置。 - **ftell (获取文件的当前读写位置)**:获取文件指针的当前位置。 - **ferror (出错的检测)**:检测文件操作是否出错。 - **clearerr (清除错误...

    Beej's Guide to C Programming

    - **枚举 (enum)**: 探讨 enum 类型的作用及其在程序设计中的应用。 - **更多的结构体声明 (More struct declarations)**: 深入探讨结构体的高级用法,包括嵌套结构体和联合体。 - **命令行参数 (CommandLine ...

    google的编程风格

    - **可拷贝类型和可移动类型**:对于需要复制或移动的对象,应该明确指定拷贝构造函数、拷贝赋值运算符、移动构造函数以及移动赋值运算符。 - **结构体VS.类**:结构体通常用来表示简单的数据结构,而类则包含了数据...

    google c++ 编程规范

    - 返回值错误码时,应明确无误的错误枚举类型。 8. **模板与泛型编程**: - 使用模板时要谨慎,避免产生大量重复代码。 - 避免使用模板元编程,除非有明确的性能需求。 9. **并发编程**: - 使用`std::mutex`...

    黑马程序员入学Java知识

    - 声明时指定数组的类型和名字。 - 初始化时分配内存并设置初始值。 9. **数组的使用** - 访问数组元素使用索引。 - 可以使用循环来遍历数组。 10. **分配内存空间** - 创建数组时会自动分配相应的内存空间。...

    遗传算法与粒子群算法的实现

    各个测试算法都被加入到TestBatch以后,batch.run()开始执行算法比较过程并输出结果Excel文件到C盘根目录(输出路径可在Testable接口中配置,除了生成Excel文件外,还可以通过修改log4j.properties在制定的位置产生...

    黑马程序员入学Java精华总结

    - 向下转换是指父类引用被显式地转换为子类类型。 15. **Java的运算符** - 包括算术运算符、比较运算符、逻辑运算符、位运算符等。 16. **表达式和三目运算符** - 表达式是由变量、常量、运算符组成的式子。 -...

    windowsnt 技术内幕

    理解引导分区与系统分区 NTFS简介 理解NFTS分区中的多回收站 在NT中考虑FAT文件系统特征 将NT计算机移植到其他域 理解NT授予权 Windows NT安装类型简介 为3张安装盘创建备份盘 理解RISC体系结构下的Windows NT安装 ...

    编写Java程序代码的30条建议

    - **实践建议:** 在构建项目时,明确指定类路径,避免因类路径配置错误导致的编译或运行时错误。 #### 24. AWT组件使用 - **要点:** 在使用AWT组件时,注意布局管理器和其他组件的兼容性问题。 - **实践建议:** ...

    java编码规范考试题答案借鉴.pdf

    - 集合在声明时应当指定模板类型(泛型),如`List&lt;String&gt; names`,以防止类型安全问题。 - 使用集合时,应合理设置初始容量,避免过多的扩容操作影响性能。 2. **线程管理**: - 新建线程时,通常会通过`...

    C#编程规范

    - **类型转换:** 明确指定转换类型,避免隐式转换带来的潜在问题。 #### 附录一 匈牙利命名法 - **匈牙利命名法简介:** 匈牙利命名法是一种变量命名约定,其中变量名包含类型信息。虽然该规范提到使用匈牙利命名...

    sqlmap使用笔记1

    - `--file-read`、`--file-write`和`--file-dest`分别用于读取、写入远程文件,`--msf-path`指定Metasploit框架路径,方便利用漏洞。 10. **多线程与调试**: `-v`控制输出详细程度,从0到6递增,`--threads`允许...

Global site tag (gtag.js) - Google Analytics