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 ...
随机推荐
- Velocity中#set指令
引用可以让模板设计者生成动态内容,而指令允许设计者真正的负责页面的展现和内容. 指令是以#开头,后面紧跟一个关键字,比如if,else,foreach等.而这个关键字,是可以被放在{}中间的.这是规范 ...
- mysql5.5主从配置
mysql主从同步# 一:mysql数据库的主从 mysql数据库5.5之后的版本和5.5以前的版本数据库主从存在差异,这里是针对数据库5.5之后的配置. 1.主库编辑my.cnf(linux的my. ...
- 关于STM32的ST官方的库的一点看法
标题确实很别扭,因为我现在用这个库也很别扭. 在不久之前,一直有个讨论的话题:STM32开发是用库还是用寄存器? 很多人的结论是不需要讨论! 但是,今天我想说下我的看法. 首先,我还是一个菜鸟,对库对 ...
- Codeforces Round #278 (Div. 1) A. Fight the Monster 暴力
A. Fight the Monster Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/487/ ...
- myeclipse-10.7-offline-installer-windows安装图解及注意事项
MyEclipse企业级工作平台(MyEclipseEnterprise Workbench ,简称MyEclipse)是对EclipseIDE的扩展,利用它我们能够在数据库和JavaEE的开发.公布 ...
- Swift常用语法示例代码(一)
此篇文章整理自我以前学习Swift时的一些练习代码,其存在的意义多是可以通过看示例代码更快地回忆Swift的主要语法. 如果你想系统学习Swift或者是Swift的初学者请绕路,感谢Github上Th ...
- Computer Science Theory for the Information Age-4: 一些机器学习算法的简介
一些机器学习算法的简介 本节开始,介绍<Computer Science Theory for the Information Age>一书中第六章(这里先暂时跳过第三章),主要涉及学习以 ...
- 今天再分享一个TextView内容风格化的类
/* * Copyright (C) 2014 Jason Fang ( ijasonfang@gmail.com ) * * Licensed under the Apache License, V ...
- 终于找到了无毒版的fences1.0(2.0版本要收费的)
今天终于安装了fences1.0,桌面不用那么乱哄哄的啦 我在博客里上传了安装文件,方便大家下载安装,这是无毒的哦,网上有很多都是不能通过病毒检测的. 地址如下:点击这里下载 使用方法: 创建块:安装 ...
- vs2010 编译Qt5.2 rc1
首先要准备一些依赖: 下载Qt 5.2.0 rc版的源码 qt-everywhere-opensource-src-5.2.0-rc1.7z 并解压出来, 我的路径为D:\qt5\qt-src-5.2 ...