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 ...
随机推荐
- Oracle新建用户、角色,授权,建表空间
oracle数据库的权限系统分为系统权限与对象权限.系统权限( database system privilege )可以让用户执行特定的命令集.例如,create table权限允许用户创建表,gr ...
- 怎么修改路由器地址的默认IP
参考文章:http://jingyan.baidu.com/article/4b52d7026e14effc5c774b30.html 一.怎么修改路由器地址的默认IP 目前绝大多数品牌有线或无线路 ...
- Squid代理服务器&&搭建透明代理网关服务器
案例需求 ——公司选用RHEL5服务器作为网关,为了有效节省网络带宽.提高局域网访问Internet的速度,需要在网关服务器上搭建代理服务,并结合防火墙策略实现透明代理,以减少客户端的重复设置工作 需 ...
- mono-project
http://download.mono-project.com/sources/libgdiplus/libgdiplus-4.2.tar.gz http://download.mono-proje ...
- BZOJ 1005: [HNOI2008]明明的烦恼 Purfer序列 大数
1005: [HNOI2008]明明的烦恼 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...
- Codeforces Gym 100418K Cards 暴力打表
CardsTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.action? ...
- GDI+与图形编程研究
GDI+的基本概念 GDI+的常用对象,包括Graphics.Font.Brush.Pen等对象的创建和使用 常用图形的绘制 Color结构.Point结构和Rectangle结构 1.GDI+的概念 ...
- [PLL][PM]锁相环模拟相位解调
%锁相环测试 %模拟相位解调 clear close all clc fs=1000; %采样率 tend=100; t=0:1/fs:tend; t(end)=[]; fc=1; %载波频偏 fb= ...
- Windows下载Android源代码
下载msysgit,安装 官方下载:http://code.google.com/p/msysgit/downloads/list, 打开Git Bash,运行命令 cd D: git clone h ...
- node.js小工具--修改Xcode 'Create by'作者名称
简介 用Xcode创建源文件时会自动在文件开始位置加入如下注释: // // ISSImageCycleScrollView.m // SoftTravel // // Created by iss1 ...