广度优先遍历目录(Windows平台、C++)
2024-08-24 22:45:33
深度优先的遍历网上一大把,就是递归调用,这里就不说了,说点网上找不到的。
#include <Windows.h>
#include <stdint.h>
#include <cstdio>
#include <cstring>
#include <string>
#include <queue> typedef int8_t (__stdcall *P_WALKDIR_CALLBACK)(const char *In_pcFilePath); int8_t WalkDir(const char *In_pcRootDir, P_WALKDIR_CALLBACK In_pfunCallBack)
{
int8_t i8RetVal = ;
std::string strLocalRoot;
std::queue<std::string> qDirectory; if (In_pcRootDir == NULL || In_pfunCallBack == NULL)
{
i8RetVal = -;
goto fun_ret;
} strLocalRoot = In_pcRootDir;
if (strLocalRoot.empty())
{
i8RetVal = -;
goto fun_ret;
} char cRootBack = strLocalRoot.back();
if (cRootBack != '\\' && cRootBack != '/')
{
strLocalRoot += '\\';
}
qDirectory.push(strLocalRoot); do
{
std::string strDirForWalk = qDirectory.front();
WIN32_FIND_DATA Win32FindData = {};
HANDLE hFindHandle = NULL; qDirectory.pop();
hFindHandle = FindFirstFile((strDirForWalk + "*").c_str(), &Win32FindData);
if (hFindHandle == INVALID_HANDLE_VALUE)
{
continue;
}
if (strcmp(Win32FindData.cFileName, ".") != && strcmp(Win32FindData.cFileName, "..") != )
{
if (Win32FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
qDirectory.push(strDirForWalk + Win32FindData.cFileName + "\\");
}
else
{
In_pfunCallBack((strDirForWalk + Win32FindData.cFileName).c_str());
}
} while (FindNextFile(hFindHandle, &Win32FindData))
{
if (strcmp(Win32FindData.cFileName, ".") != && strcmp(Win32FindData.cFileName, "..") != )
{
if (Win32FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
qDirectory.push(strDirForWalk + Win32FindData.cFileName + "\\");
}
else
{
In_pfunCallBack((strDirForWalk + Win32FindData.cFileName).c_str());
}
}
} if (hFindHandle != NULL)
{
FindClose(hFindHandle);
}
} while (!qDirectory.empty()); fun_ret:
return i8RetVal;
} int8_t __stdcall WalkDirCallBack(const char *In_pcFilePath)
{
if (In_pcFilePath != NULL)
{
printf("%s\n", In_pcFilePath);
}
return ;
} void main(int argc, char **argv)
{
WalkDir(argv[], WalkDirCallBack);
return;
}
PS:
用Python测试遍历结果正确性,发现Python是深度优先的遍历,呵呵。
最新文章
- jquery toggle方法使用出错?请看这里-遁地龙卷风
- Spring配置文件详解 - applicationContext.xml文件路径
- plsql+绿色版oracle连接远程数据库配置及提示缺少msvcr71.dll解决方法
- pip高级使用技巧以及搭建自己的pypi服务器
- Oracle之自动收集统计信息
- UVa11732 ";strcmp()"; Anyone?(Trie树+孩子兄弟表示法)
- Thinking In Java 读书笔记
- JavaScript使用技巧
- Nginx详解以及LNMP的搭建
- C#语言中的修饰符
- 性能瓶颈之System
- Linux下maven安装
- hdu 1864 最大报销额 01背包
- [学习笔记]CDQ分治和整体二分
- 修改MyEclipse取消默认工作空间
- Codeforces Round #440 (Div. 2, based on Technocup 2018 Elimination Round 2) D. Something with XOR Queries
- OpenGL学习笔记(4) GLM库的使用
- java内存结构JVM——java内存模型JMM——java对象模型JOM
- KnockoutJS Select 标签 Options绑定
- Java xml 操作(Dom4J修改xml &#160;&#160;+ xPath技术 &#160;+ SAX解析 + XML约束)