Windows C++ 非递归式(stack)深度优先遍历目录
2024-09-30 03:47:09
#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;
}
最新文章
- win10 安装framework3.5
- Android Studio 常用快捷键
- Jmeter使用入门
- 赴美工作常识(Part 2 - 申请)
- Python进程、线程
- 已禁用对分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具启用 DTC 以便在 MSDTC 安全配置中进行网络访问。
- 000 VS2013 c++ 框架
- HDU 2473 Junk-Mail Filter(并查集+删点,设立虚父节点/找个代理)
- 日志管理 rsyslog服务浅析
- python 重载 __hash__ __eq__
- 深入浅出 ThreadLocal(一)
- [CSS3] 学习笔记-CSS入门基本知识
- 数据结构 Python实现
- oralce执行计划
- Python笔记 【无序】 【一】
- Red-Gate.NET.Reflector.v8.0.1.308(内含注册机Keygen与注册图解)
- hdu5178 pairs
- CentOS使用vsftpd开启FTP服务以及配置用户
- Java API方式调用Kafka各种协议
- linux安装scala环境
热门文章
- 【微信小程序】 引用公共js里的方法
- TP3.2校验微信公众号||小程序 服务器地址
- MySQL-五种日志(查询日志、慢查询日志、更新日志、二进制日志、错误日志)、备份及主从复制配置
- HDUOJ------1711Number Sequence
- 验证码在后台的编写,并实现点击验证码图片时时发生更新 C# 项目发布到IIS后不能用log4net写日志
- JMeter学习-内存溢出解决方法
- RHEL7 -- 通过gerp使用正则表达式
- AspxPivotGrid和WebChartControl数据联动处理日志
- Python ljust() 方法
- elk中文教程