vc 枚举文件

//直接贴代码

//头文件

/*
 说明:以广度搜索优先,以回调函数的方式通知
 */
 //UNICODE

 //枚举文件的通知,回调返回0表示退出枚举
 //如果在回调中调用枚举函数,则为深度搜索
 typedef BOOL (CALLBACK* FL_EnumFileCallBackW)(
	 /*文件的完全路径,为局部变量,如果要使用应该拷贝而不是直接使用*/
	 __in LPWSTR lpFileName,
	 //WIN32_FIND_DATA结构
	 __in PWIN32_FIND_DATAW  pFindData,
	 /*附加数据*/
	 __in LPVOID lpData);


 typedef FL_EnumFileCallBackW P_FL_ENUMFILECALLBACKW;

 //枚举目录的通知,回调返回0表示退出枚举
 //如果在回调中调用枚举函数,则为深度搜索
 typedef BOOL (CALLBACK* FL_EnumDirectoryCallBackW)(
	 //目录的完整路径,局部变量
	 __in LPWSTR lpDirectoryName,
	 //WIN32_FIND_DATA结构
	 __in PWIN32_FIND_DATAW  pFindData,
	 //附加数据
	 __in LPVOID  lpData); 

 typedef FL_EnumDirectoryCallBackW P_FL_ENUMDIRECTORYCALLBACKW;


 //枚举一个目录
 VOID __stdcall FL_EnmuDirectoryW(
	 /*目录的完整路径,不要在后面添加 \\,例如e盘,这里的调用为 e: 不要 \\  */
	 __in LPWSTR  lpDirecoryFullPath,
	 //扩展名,可用通配符 *.*(同样可为NULL表示),例如 *.exe或 aaa.*等
	 __in LPWSTR szPrepareString, 
	 //枚举lpDirecoryFullPath当前目录下得到的目录,以回调的方式通知
	 __in P_FL_ENUMDIRECTORYCALLBACKW pfnDirectoryCallback,
	 //pfnDirectoryCallback的附加参数,可为NULL,表示不再使用
	 __in LPVOID pDirectoryCallbackData,
	 //枚举lpDirecoryFullPath当前目录下得到的文件,以回调的方式通知
	 __in P_FL_ENUMFILECALLBACKW   pfnFileCallback,
	 //pfnFileCallback的附加参数,可为NULL,表示不使用
	 __in LPVOID  pFileCallbackData);

 //ASNI
 //枚举文件的通知,回调返回0表示退出枚举
 //如果在回调中调用枚举函数,则为深度搜索
 typedef BOOL (CALLBACK* FL_EnumFileCallBackA)(
	 /*文件的完全路径,为局部变量,如果要使用应该拷贝而不是直接使用*/
	 __in LPSTR lpFileName,
	 //WIN32_FIND_DATA结构
	 __in PWIN32_FIND_DATAA  pFindData,
	 /*附加数据*/
	 __in LPVOID lpData);


 typedef FL_EnumFileCallBackA P_FL_ENUMFILECALLBACKA;

 //枚举目录的通知,回调返回0表示退出枚举
 //如果在回调中调用枚举函数,则为深度搜索
 typedef BOOL (CALLBACK* FL_EnumDirectoryCallBackA)(
	 //目录的完整路径,局部变量
	 __in LPSTR lpDirectoryName,
	 //WIN32_FIND_DATA结构
	 __in PWIN32_FIND_DATAA  pFindData,
	 //附加数据
	 __in LPVOID  lpData); 

 typedef FL_EnumDirectoryCallBackA P_FL_ENUMDIRECTORYCALLBACKA;




 //枚举一个目录
 VOID __stdcall FL_EnmuDirectoryA(
	 /*目录的完整路径,不要在后面添加 \\,例如e盘,这里的调用为 e: 不要 \\  */
	 __in LPSTR  lpDirecoryFullPath,
	 //扩展名,可用通配符 *.*(同样可为NULL表示),例如 *.exe或 aaa.*等
	 __in LPSTR szPrepareString, 
	 //枚举lpDirecoryFullPath当前目录下得到的目录,以回调的方式通知
	 __in P_FL_ENUMDIRECTORYCALLBACKA pfnDirectoryCallback,
	 //pfnDirectoryCallback的附加参数,可为NULL,表示不再使用
	 __in LPVOID pDirectoryCallbackData,
	 //枚举lpDirecoryFullPath当前目录下得到的文件,以回调的方式通知
	 __in P_FL_ENUMFILECALLBACKA   pfnFileCallback,
	 //pfnFileCallback的附加参数,可为NULL,表示不使用
	 __in LPVOID  pFileCallbackData);


#ifdef UNICODE
#define  P_FL_ENUMFILECALLBACK P_FL_ENUMFILECALLBACKW
#define  P_FL_ENUMDIRECTORYCALLBACK P_FL_ENUMDIRECTORYCALLBACKW
#define  FL_EnmuDirectory FL_EnmuDirectoryW
#else
#define  P_FL_ENUMFILECALLBACK P_FL_ENUMFILECALLBACKA
#define  P_FL_ENUMDIRECTORYCALLBACK P_FL_ENUMDIRECTORYCALLBACKA
#define  FL_EnmuDirectory FL_EnmuDirectoryA
#endif

#ifndef EnmuDirectoryW 
#define EnmuDirectoryW FL_EnmuDirectoryW
#endif

#ifndef EnmuDirectoryA
#define  EnmuDirectoryA FL_EnmuDirectoryA
#endif

#ifdef UNICODE
#define  EnmuDirectory EnmuDirectoryW
#else
#define  EnmuDirectory EnmuDirectoryA
#endif
//源文件

VOID __stdcall FL_EnmuDirectoryW(
								 /*目录的完整路径,不要在后面添加 \\,例如e盘,这里的调用为 e: 不要 \\  */
								 __in LPWSTR  lpDirecoryFullPath,
								 //扩展名,可用通配符 *.*(同样可为NULL表示),例如 *.exe或 aaa.*等
								 //如果文件没有扩展名,使用*.*才能找到
								 __in LPWSTR szPrepareString, 
								 //枚举lpDirecoryFullPath当前目录下得到的目录,以回调的方式通知
								 __in P_FL_ENUMDIRECTORYCALLBACKW pfnDirectoryCallback,
								 //pfnDirectoryCallback的附加参数,可为NULL,表示不再使用
								 __in LPVOID pDirectoryCallbackData,
								 //枚举lpDirecoryFullPath当前目录下得到的文件,以回调的方式通知
								 __in P_FL_ENUMFILECALLBACKW   pfnFileCallback,
								 //pfnFileCallback的附加参数,可为NULL,表示不使用
								 __in LPVOID  pFileCallbackData)
{
	if(!pfnDirectoryCallback || !pfnFileCallback) return ;//没有指定回调是不会枚举的,除非至少任意一个有效
	WCHAR *pszTemp= new WCHAR[MAX_PATH];//如果分配失败就会异常
	WIN32_FIND_DATAW* pfinddata = new WIN32_FIND_DATAW;
	HANDLE hFind=NULL;
	BOOL bok_dir=TRUE;
	BOOL bok_file=TRUE;

	int len=0;

	if(!szPrepareString)
		wnsprintfW(pszTemp,MAX_PATH+1,L"%s\\*.*\0",lpDirecoryFullPath);
	else
		wnsprintfW(pszTemp,MAX_PATH+1,L"%s\\%s\0",lpDirecoryFullPath,szPrepareString);
	//折衷做法,防止字符路径溢出
	len=lstrlenW(pszTemp)+1;
	if(len>MAX_PATH) {
		delete pfinddata;
		delete [] pszTemp;//如果溢出了,释放会导致异常
		return ;//溢出了,实际上从长度判断没有效果,运行时库在调用lstrlenw之前先俘获到溢出
	}
	hFind=FindFirstFileW(pszTemp,pfinddata);
	if(hFind==INVALID_HANDLE_VALUE){
		delete pfinddata;
		delete [] pszTemp;	
		return ;
	}
	do{
		ZeroMemory(pszTemp,MAX_PATH*sizeof(WCHAR));
		wnsprintfW(pszTemp,MAX_PATH+1,L"%s\\%s\0",lpDirecoryFullPath,pfinddata->cFileName);
		len=lstrlenW(pszTemp)+1;
		if(len>MAX_PATH) {
			delete pfinddata;
			delete [] pszTemp;
			return ;//-------------------
		}
		if((pfinddata->dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
			==FILE_ATTRIBUTE_DIRECTORY){
				if(pfnDirectoryCallback && bok_dir)
					bok_dir=pfnDirectoryCallback(pszTemp,pfinddata,pDirectoryCallbackData);
		}else{
			if(pfnFileCallback && bok_file)
				bok_file=pfnFileCallback(pszTemp,pfinddata,pFileCallbackData);
		}
	}while(FindNextFileW(hFind,pfinddata)&( bok_dir|bok_file));
	delete pfinddata;
	delete [] pszTemp;
	return ;
}
//
VOID __stdcall FL_EnmuDirectoryA(
								 /*目录的完整路径,不要在后面添加 \\,例如e盘,这里的调用为 e: 不要 \\  */
								 __in LPSTR  lpDirecoryFullPath,
								 //扩展名,可用通配符 *.*(同样可为NULL表示),例如 *.exe或 aaa.*等
								 __in LPSTR szPrepareString, 
								 //枚举lpDirecoryFullPath当前目录下得到的目录,以回调的方式通知
								 __in P_FL_ENUMDIRECTORYCALLBACKA pfnDirectoryCallback,
								 //pfnDirectoryCallback的附加参数,可为NULL,表示不再使用
								 __in LPVOID pDirectoryCallbackData,
								 //枚举lpDirecoryFullPath当前目录下得到的文件,以回调的方式通知
								 __in P_FL_ENUMFILECALLBACKA   pfnFileCallback,
								 //pfnFileCallback的附加参数,可为NULL,表示不使用
								 __in LPVOID  pFileCallbackData)
{
	if(!pfnDirectoryCallback || !pfnFileCallback) return ;//没有指定回调是不会枚举的,除非至少任意一个有效
	CHAR *pszTemp= new CHAR[MAX_PATH];//如果分配失败就会异常
	WIN32_FIND_DATAA* pfinddata = new WIN32_FIND_DATAA;
	HANDLE hFind=NULL;
	BOOL bok_dir=TRUE;
	BOOL bok_file=TRUE;

	int len=0;

	if(!szPrepareString)
		wnsprintfA(pszTemp,MAX_PATH+1,"%s\\*.*\0",lpDirecoryFullPath);
	else
		wnsprintfA(pszTemp,MAX_PATH+1,"%s\\%s\0",lpDirecoryFullPath,szPrepareString);
	//折衷做法,防止字符路径溢出
	len=lstrlenA(pszTemp)+1;
	if(len>MAX_PATH) {
		delete pfinddata;
		delete [] pszTemp;//如果溢出了,释放会导致异常
		return ;//溢出了,实际上从长度判断没有效果,运行时库在调用lstrlenw之前先俘获到溢出
	}
	hFind=FindFirstFileA(pszTemp,pfinddata);
	if(hFind==INVALID_HANDLE_VALUE){
		delete pfinddata;
		delete [] pszTemp;	
		return ;
	}
	do{
		ZeroMemory(pszTemp,MAX_PATH*sizeof(CHAR));
		wnsprintfA(pszTemp,MAX_PATH+1,"%s\\%s\0",lpDirecoryFullPath,pfinddata->cFileName);
		len=lstrlenA(pszTemp)+1;
		if(len>MAX_PATH) {
			delete pfinddata;
			delete [] pszTemp;
			return ;//-------------------
		}
		if((pfinddata->dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
			==FILE_ATTRIBUTE_DIRECTORY){
				if(pfnDirectoryCallback && bok_dir)
					bok_dir=pfnDirectoryCallback(pszTemp,pfinddata,pDirectoryCallbackData);
		}else{
			if(pfnFileCallback && bok_file)
				bok_file=pfnFileCallback(pszTemp,pfinddata,pFileCallbackData);
		}
	}while(FindNextFileA(hFind,pfinddata)&( bok_dir|bok_file));
	delete pfinddata;
	delete [] pszTemp;
	return ;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值