Windows C++ 非递归式(stack)深度优先遍历目录
#include <Windows.h>
#include <cstdio>
#include <cstring>
#include <string>
#include <stack> typedef void (__stdcall *P_WALK_DIR_CALLBACK)(const std::string &In_strFilePath); int WalkDir(const char *In_pcRoot, P_WALK_DIR_CALLBACK In_pfunCallBack)
{
int iRetVal = ;
std::string strRoot;
std::stack<std::string> stkDirs; if (In_pcRoot == NULL || In_pfunCallBack == NULL)
{
iRetVal = -;
goto fun_ret;
} strRoot = In_pcRoot;
if (strRoot.empty())
{
iRetVal = -;
goto fun_ret;
} if (strRoot.back() != '\\' && strRoot.back() != '/')
strRoot += '\\';
stkDirs.push(strRoot); while (!stkDirs.empty())
{
std::string strDirForWalk;
WIN32_FIND_DATAA Win32FindData = {};
HANDLE hFindHandle = NULL; strDirForWalk = stkDirs.top();
stkDirs.pop();
hFindHandle = FindFirstFileA((strDirForWalk + "*").c_str(), &Win32FindData);
if (hFindHandle == INVALID_HANDLE_VALUE)
continue; if (!(strlen(Win32FindData.cFileName) == && strncmp(Win32FindData.cFileName, ".", ) == )
&& !(strlen(Win32FindData.cFileName) == && strncmp(Win32FindData.cFileName, "..", ) == ))
{
if (Win32FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
stkDirs.push(strDirForWalk + Win32FindData.cFileName + "\\");
else
In_pfunCallBack(strDirForWalk + Win32FindData.cFileName);
}
while (FindNextFileA(hFindHandle, &Win32FindData))
{
if (!(strlen(Win32FindData.cFileName) == && strncmp(Win32FindData.cFileName, ".", ) == )
&& !(strlen(Win32FindData.cFileName) == && strncmp(Win32FindData.cFileName, "..", ) == ))
{
if (Win32FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
stkDirs.push(strDirForWalk + Win32FindData.cFileName + "\\");
else
In_pfunCallBack(strDirForWalk + Win32FindData.cFileName);
}
} if (hFindHandle != INVALID_HANDLE_VALUE)
FindClose(hFindHandle);
} fun_ret:
return iRetVal;
} void inline __stdcall WalkDirCallBack(const std::string &In_strFilePath)
{
printf("%s\n", In_strFilePath.c_str());
return;
} void main(int argc, char **argv)
{
WalkDir(argv[], WalkDirCallBack);
return;
}
Windows C++ 非递归式(stack)深度优先遍历目录的更多相关文章
- 非递归实现先序遍历 java leecode 提交
写完才知道自己学习都是似是而非啊,大家可以也在leecode上提交代码,纯手写,离开eclipse第一种方式:数据结构书上的,使用栈大概思路.1.不断将根节点的左孩子的左孩子直到为空,在这个过程入栈. ...
- 数据结构-树以及深度、广度优先遍历(递归和非递归,python实现)
前面我们介绍了队列.堆栈.链表,你亲自动手实践了吗?今天我们来到了树的部分,树在数据结构中是非常重要的一部分,树的应用有很多很多,树的种类也有很多很多,今天我们就先来创建一个普通的树.其他各种各样的树 ...
- 图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)
参考网址:图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS) - 51CTO.COM 深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath ...
- 基于visual Studio2013解决面试题之0401非递归遍历二叉树
题目
- 二叉树3种递归和非递归遍历(Java)
import java.util.Stack; //二叉树3种递归和非递归遍历(Java) public class Traverse { /******************一二进制树的定义*** ...
- Java实现二叉树的先序、中序、后序、层序遍历(递归和非递归)
二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易 ...
- 非递归遍历二叉树Java版的实现代码(没写层次遍历)
直接上代码呵呵,里面有注解 package www.com.leetcode.specificProblem; import java.util.ArrayList; import java.util ...
- C++编程练习(17)----“二叉树非递归遍历的实现“
二叉树的非递归遍历 最近看书上说道要掌握二叉树遍历的6种编写方式,之前只用递归方式编写过,这次就用非递归方式编写试一试. C++编程练习(8)----“二叉树的建立以及二叉树的三种遍历方式“(前序遍历 ...
- Java ---- 遍历链表(递归与非递归实现)
package test; //前序遍历的递归实现与非递归实现 import java.util.Stack; public class Test { public static void main( ...
随机推荐
- Spring配置文件头信息
代码如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http:// ...
- SpringBoot使用拦截器
SpringBoot的拦截器只能拦截流经DispatcherServlet的请求,对于自定义的Servlet无法进行拦截. SpringMVC中的拦截器有两种:HandlerInterceptor和W ...
- Linux-支持中文
转自:http://www.centoscn.com/CentosBug/osbug/2014/0919/3776.html 英文版的linux系统默认不支持中文显示 那么如何显示中文呢? 可以使用l ...
- 设置Adobe Reader打开PDF文件保持记忆功能
设置Adobe Reader打开PDF文件保持记忆功能 打开菜单“编辑”->“首选项”. 选择种类中的“文档”,在“打开设置”区域勾上“重新打开文档时恢复上次视图设置(R)”,确定之后就可以在下 ...
- Linux中断 - softirq
一.前言 对于中断处理而言,linux将其分成了两个部分,一个叫做中断handler(top half),是全程关闭中断的,另外一部分是deferable task(bottom half),属于不那 ...
- Python abs() 函数
描述 abs() 函数返回数字的绝对值. 语法 以下是 abs() 方法的语法: abs( x ) 参数 x -- 数值表达式,可以是整数,浮点数,复数. 返回值 函数返回 x(数字)的绝对值,如果参 ...
- JSP页面中文乱码
近期搭建了一个JAVA WEB项目,引入了国际化的ResourceBundle. 顺便赞一个,Eclipse Mars,自带了中文转unicode编码的功能. ① 根据语言选择,初始化Resource ...
- ORACLE11g中毒恢复
很不幸的,win2003server疏于管理,中毒了,清理了病毒以后.oracle也瘫痪了.上次备份还在一周前,这一周的数据咋办? 首先的想法,是另找一台机器,装个一模一样的oracle.再把被删的文 ...
- W5500初始化过程
- nginx 内置变量大全(转)
HTTP核心模块支持一些内置变量,变量名与apache里的对应.比如 $http_user_agent,$http_cookie等表示HTTP请求信息的变量.更多变量:$args, 请求中的参数; $ ...