//直接贴代码
//头文件
/*
说明:以广度搜索优先,以回调函数的方式通知
*/
//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 ;
}