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 ;}
- vc 枚举文件
- vc++中的文件操作及枚举进程
- VC枚举(遍历)文件夹里面的文件
- vc 枚举磁盘,在磁盘里写文件的操作
- VC++ 枚举一个文件夹中的某类文件
- vc串口枚举类
- VC枚举进程方法
- vc 枚举任务栏
- [VC++]枚举进程列表
- VC++ 枚举串口列表
- VC 枚举电脑串口
- VC 枚举进程
- [vc++]枚举USB设备
- VC枚举进程方法
- VC++进行窗口枚举
- 文件枚举
- 枚举系统进程VC代码
- VC枚举进程方法(转载)
- camera
- 连线:互联网公司是怎样激发你的消费欲望的?
- Minify在Nginx上的rewrite配置
- Log4net创建日志及简单扩展
- mysql 表查询
- vc 枚举文件
- Oracle® Database 2 Day DBA 11.2翻译--第二章 Oracle数据库软件安装和数据库建立(上)
- 常用英语词汇
- 腾讯资深产品经理谈敏捷开发于游戏
- 对xml文档的修改与删除
- N97锁屏
- vs2010 中使用 log4net
- 如何写一个像UIImagePicker一样的自定义图片选择器
- vc 获取当前模块基地址(HMODULE)