Win32非递归遍历和搜索文件以及目录算法
转载请注明来源:http://www.cnblogs.com/xuesongshu
要点:
1、搜索的顶层目录在进入循环之前进栈
2、栈元素存储字符串指针,出栈时释放资源
3、每次循环开始,栈顶元素出栈
4、在遍历一个文件夹时,遇到子文件夹则进栈
5、外层循环以堆栈是否为空为标志,内层循环以FindNextFile返回值为标志
6、本搜索算法适用于按关键字搜索,当文件夹名称符合搜索条件时文件夹作为搜索结果通知调用者,不会入栈。
7、回调函数地址使用long型传递
8、本程序功能是批量增加、修改或者删除指定文件夹下所有文件前缀,附带遍历功能。在参照流程图编写实现代码时与流程图所画逻辑会稍有出入。
流程图如下:
需要引入的头文件:
- #include <stack>
- #include <iostream>
- #include <fstream>
- #include <list>
- #include <set>
回调函数定义:
- typedef HRESULT (__stdcall *XCallbackMethodType)(HWND,BSTR,int);
实现代码如下:
- STDMETHODIMP CFileTool::SearchFiles(BSTR topDirectoryName, BSTR key, HWND mainWnd,long callbackAddress)
- {
- HINSTANCE dllInst=(HINSTANCE)GetModuleHandle(L"xssfj.dll");
- WCHAR finishedMsg[256]={0};
- LoadString(dllInst,IDS_FILE_DELETESPECIFY_SEARCHSUCCESS,finishedMsg,256);
- XCallbackMethodType callbackMsg=(XCallbackMethodType)callbackAddress;
- DWORD attribute=GetFileAttributesW(topDirectoryName);
- if(!(attribute&FILE_ATTRIBUTE_DIRECTORY))
- return E_INVALIDARG;
- if(!callbackMsg)
- return E_INVALIDARG;
- if(StrStrI(topDirectoryName,key))
- {
- callbackMsg(mainWnd,topDirectoryName,2);
- callbackMsg(mainWnd,finishedMsg,0);
- return S_OK;
- }
- std::stack<WCHAR*> directoryNameStack;
- WCHAR* tmpStackData=(WCHAR*)calloc(MAX_PATH,sizeof(WCHAR));
- lstrcpyW(tmpStackData,topDirectoryName);
- directoryNameStack.push(tmpStackData);
- while(!directoryNameStack.empty())
- {
- WCHAR* currentDirName=directoryNameStack.top();
- directoryNameStack.pop();
- callbackMsg(mainWnd,currentDirName,1);
- WCHAR tmpParentPath[MAX_PATH]={0};
- lstrcpy(tmpParentPath,currentDirName);
- if(currentDirName[lstrlen(currentDirName)-1]!='\\')
- {
- lstrcat(tmpParentPath,L"\\");
- lstrcat(currentDirName,L"\\*.*");
- }
- else
- lstrcat(currentDirName,L"*.*");
- WIN32_FIND_DATA meiju={0};
- HANDLE tmpHandle=FindFirstFile(currentDirName,&meiju);
- if(tmpHandle!=INVALID_HANDLE_VALUE&&tmpHandle)
- {
- if(lstrcmpW(meiju.cFileName,L".")!=0&&lstrcmpW(meiju.cFileName,L"..")!=0)
- {
- if(StrStrI(meiju.cFileName,key))
- {
- WCHAR tmpFsObj[MAX_PATH]={0};
- lstrcpyW(tmpFsObj,tmpParentPath);
- lstrcat(tmpFsObj,meiju.cFileName);
- callbackMsg(mainWnd,tmpFsObj,2);
- }
- }
- do
- {
- DWORD tmpFileResult=FindNextFile(tmpHandle,&meiju);
- if(tmpFileResult==ERROR_NO_MORE_FILES||tmpFileResult==0)
- break;
- if(lstrcmpW(meiju.cFileName,L".")==0||lstrcmpW(meiju.cFileName,L"..")==0)
- continue;
- if(StrStrI(meiju.cFileName,key))
- {
- WCHAR tmpFsObj[MAX_PATH]={0};
- lstrcpyW(tmpFsObj,tmpParentPath);
- lstrcat(tmpFsObj,meiju.cFileName);
- callbackMsg(mainWnd,tmpFsObj,2);
- }
- else
- {
- WCHAR tmpFsobjPath[MAX_PATH]={0};
- lstrcpy(tmpFsobjPath,tmpParentPath);
- lstrcat(tmpFsobjPath,meiju.cFileName);
- callbackMsg(mainWnd,tmpFsobjPath,1);
- DWORD tmpFileAttribute=GetFileAttributes(tmpFsobjPath);
- if(tmpFileAttribute&FILE_ATTRIBUTE_DIRECTORY)
- {
- WCHAR* tmpData=(WCHAR*)calloc(MAX_PATH,sizeof(WCHAR));
- lstrcpy(tmpData,tmpFsobjPath);
- directoryNameStack.push(tmpData);
- }
- }
- }
- while(true);
- FindClose(tmpHandle);
- }
- free(currentDirName);
- }
- callbackMsg(mainWnd,finishedMsg,0);
- return S_OK;
- }
Win32非递归遍历和搜索文件以及目录算法的更多相关文章
- 二叉树3种递归和非递归遍历(Java)
import java.util.Stack; //二叉树3种递归和非递归遍历(Java) public class Traverse { /******************一二进制树的定义*** ...
- C++编程练习(17)----“二叉树非递归遍历的实现“
二叉树的非递归遍历 最近看书上说道要掌握二叉树遍历的6种编写方式,之前只用递归方式编写过,这次就用非递归方式编写试一试. C++编程练习(8)----“二叉树的建立以及二叉树的三种遍历方式“(前序遍历 ...
- ZT 二叉树的非递归遍历
ZT 二叉树的非递归遍历 二叉树的非递归遍历 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就 是递归定 ...
- 数据结构二叉树的递归与非递归遍历之java,javascript,php实现可编译(1)java
前一段时间,学习数据结构的各种算法,概念不难理解,只是被C++的指针给弄的犯糊涂,于是用java,web,javascript,分别去实现数据结构的各种算法. 二叉树的遍历,本分享只是以二叉树中的先序 ...
- c/c++二叉树的创建与遍历(非递归遍历左右中,破坏树结构)
二叉树的创建与遍历(非递归遍历左右中,破坏树结构) 创建 二叉树的递归3种遍历方式: 1,先中心,再左树,再右树 2,先左树,再中心,再右树 3,先左树,再右树,再中心 二叉树的非递归4种遍历方式: ...
- c/c++叉树的创建与遍历(非递归遍历左右中,不破坏树结构)
二叉树的创建与遍历(非递归遍历左右中,不破坏树结构) 创建 二叉树的递归3种遍历方式: 1,先中心,再左树,再右树 2,先左树,再中心,再右树 3,先左树,再右树,再中心 二叉树的非递归4种遍历方式: ...
- 非递归遍历N-ary树Java实现
2019-03-25 14:10:51 非递归遍历二叉树的Java版本实现之前已经进行了总结,这次做的是非递归遍历多叉树的Java版本实现. 在非递归遍历二叉树的问题中我个人比较推荐的是使用双whil ...
- JAVA递归、非递归遍历二叉树(转)
原文链接: JAVA递归.非递归遍历二叉树 import java.util.Stack; import java.util.HashMap; public class BinTree { priva ...
- 非递归遍历二叉树Java实现
2018-10-03 20:16:53 非递归遍历二叉树是使用堆栈来进行保存,个人推荐使用双while结构,完全按照遍历顺序来进行堆栈的操作,当然在前序和后序的遍历过程中还有其他的压栈流程. 一.Bi ...
随机推荐
- iOS开发-数据持久化
iOS中四种最常用的将数据持久存储在iOS文件系统的机制 前三种机制的相同点都是需要找到沙盒里面的Documents的目录路径,附加自己相应的文件名字符串来生成需要的完整路径,再往里面创建.读取.写入 ...
- Parallax Occlusion Mapping
如上图,本来是采样original texture coordinates点的颜色,其实却采样了correcter texture coordinates点的颜色. 而且会随着视线的不同看到凹凸程度变 ...
- delphi TTreeView组件遍历磁盘目录
TTreeView组件遍历磁盘目录 实例说明 TTreeView组件是一个以分枝结构或者说树状结构显示数据的组件,以该组件显示数据具有较好的等级关系和逻辑层次,并且易于操作.在组件中显示的数据结构与系 ...
- TOJ 4325 RMQ with Shifts / 线段树单点更新
RMQ with Shifts 时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte 描述 In the traditional RMQ (Range M ...
- iOS开发——动画篇Swift篇&常用动画总结
UIView动画: UIView动画时最基本的动画,是直接对我们界面上控件进行简单的动画效果实现,如果你只需要用到一些简单的效果,那么这个很适合你,关于UIView动画实现恨简单, UIKit直接将动 ...
- SAP SOAMANAGER 配置WEBSERVICE 提示:Service cannot be reached解决方法
TM中有些服务没有被激活,以UI界面个性化设置化设置为例: 如果服务没有被激活,打开界面就会显示: 这时候右键点击属性,获取服务ID: 通过事务代码SICF,输入服务ID:wd_analyze_con ...
- OSGi 学习(一)
从基础开始,先来说说OSGi的基本理念. OSGi通过隔离底层classloader,强制应用在设计的时候就考虑模块化,并且基于白板模式来支持服务的注册与订阅. 在OSGi中,模块可以等价理解为bun ...
- 详解SQL Server连接(内连接、外连接、交叉连接)
在查询多个表时,我们经常会用“连接查询”.连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志. 什么是连接查询呢? 概念:根据两个表或多个表的列之间的关系,从这些表中查询数据 ...
- Hive官方手册翻译(Getting Started)(转)
原文:http://slaytanic.blog.51cto.com/2057708/939950 翻译Hive官方文档系列,文中括号中包含 注: 字样的,为我自行标注的,水平有限,翻译不是完美无缺的 ...
- js学习笔记第二篇
Js笔记整理 1.StringAPI a) 大小写转换:str.toUpperCase();str.toLowerCase(); b) 获取指定位置字符: Str[i]-- ...