【问题标题】:How do I traverse into directories?如何遍历目录?
【发布时间】:2011-07-23 15:38:04
【问题描述】:

如果我有一个包含 5 个子文件夹的文件夹,并且我想在每个子文件夹中搜索某些文件(我的程序存在于主文件夹中)。如何让我的程序在 C++ 中进出这些文件夹?

我需要我的程序在 Windows 平台上运行。

谢谢!

【问题讨论】:

标签: c++ windows search traversal


【解决方案1】:

只需使用boost's recursive_directory_iterator,并过滤您想要的文件/目录。

boost::filesystem::recursive_directory_iterator iter("your\path");
boost::filesystem::recursive_directory_iterator end;
for (; iter != end; ++iter) {
    // check for things like is_directory(iter->status()), iter->filename() ....
    // optionally, you can call iter->no_push() if you don't want to
    // enter a directory
    // see all the possibilities by reading the docs.
}

【讨论】:

    【解决方案2】:

    最明显的方法是使用FindFirstFileFindnextFile,以及SetCurrentDirectory。遍历子目录的一种明显方法是使目录遍历例程递归。

    【讨论】:

    • 如果我想使用那些糟糕、糟糕的 Windows 功能,我只会使用 C#。
    • 如果您不想想使用 Windows API,那么在问题中提及这一点可能是有意义的。一种选择是boost::filesystemboost.org/doc/libs/1_46_0/libs/filesystem/v3/doc/index.htm
    • 不,没有。 Boost::filesystem 仅包含许多底层系统的不可移植代码(例如,一个用于 POSIX,另一个用于 Win32 等)。实际上,考虑到当今大量使用的系统,POSIX 和 Win32 可能涵盖了大多数人可能会关心。
    • @MisterSir Windows 是微软软件开发人员编写的 C 程序。
    • @MisterSir:谷歌搜索“NT native API”应该至少会出现一些结果。虽然它没有正式记录,并且发布了大部分可用内容的人已经被 MS 买断了,现在通常很难找到。如果没记错的话,您可以推断出相当多的 Windows DDK 文档。然而,没有比这更好的理由了,使用原生 API 让我觉得非常可笑。
    【解决方案3】:

    只需使用堆栈并实现深度优先搜索(参见 wiki)http://en.wikipedia.org/wiki/Depth-first_search

    通过这种方式,您可以(使用尽可能小的堆栈)遍历任何树状结构(并且 Windows 的文件系统是树状的)。

    【讨论】:

    • 或者你让编译器处理堆栈,只使用递归。
    • 这是一个非常奇怪的评论,因为 DFS 既可以使用递归也可以使用 for 循环和您自己的堆栈来实现,而且我没有将提问者推送到这两种实现中的任何一种。对于这两种实现,DFS 的堆栈(您自己的或调用堆栈)确实比 BFS 小)。
    • @Roy:我没有说递归是唯一的方法,我只是相信使用递归实现起来要简单得多。编译器现在非常好,所以任何时候你可以把东西留给编译器,这样做可能是个好主意(除非你有特定的理由不这样做)。
    • 不能保证 DFS 的堆栈比 BFS 小。如果走 a\very\long\path\toward\hell\like\this\one\except\hell\is\nicer\than\the\path_max\limitation,则 DFS 的堆栈将获得与递归一样多的条目,其中如果此目录线程是唯一的,则 BFS 一次将只有一个堆栈条目。
    • 现在编译器确实可以比人类优化更多,但是递归真的很难优化,因为有趣的事情发生在运行时,我认为在编译时无法彻底分析递归.这将成为一个有趣的话题。
    猜你喜欢
    • 2016-07-24
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多