vc 枚举文件

来源:互联网 发布:马云淘宝提成怎么算 编辑:程序博客网 时间:2024/06/07 10:43

//直接贴代码

//头文件

/* 说明:以广度搜索优先,以回调函数的方式通知 */ //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);elsewnsprintfW(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);elsewnsprintfA(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 ;}



原创粉丝点击