列出子目录中所有文件的递归函数

新手上路,请多包涵

我正在尝试编写一个函数,该函数返回当前文件夹及其所有子文件夹中所有文件的列表。我写了这段代码:

 #include <iostream>
#include <dirent.h>
#include <cstring>

using namespace std;

int main() {
   DIR* dir; dirent* pdir;
   //From my workspace
   dir=opendir(".");
   while (pdir=readdir(dir)) {
       if(/**********This pdir is a directory**********/) {
           /**********RECURSIVE CALL SHOULD BE HERE**********/
           cout<<pdir->d_name<<endl;
       }
   }
   closedir(dir);
   return 0;
}

我在谷歌搜索它,但我不知道如何:

  • 检查当前 pdir 是否为目录
  • 进入目录并对其执行递归调用

同时,我在 main 上有一切,因为我仍然不知道递归函数应该有什么参数。

有什么提示吗?

原文由 Maroun 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 394
2 个回答

在将基目录路径作为参数的过程中隔离该代码,以便您可以实际执行递归调用。它应该是这样的

void recursive_file_list(const char * directory)
{
    // ...
}

然后,检查你获得的 pdir 是否是一个目录,你有两条路线:

  • 您可以检查是否 pdir->d_type==DT_DIR ;这会立即为您提供此信息,但它不可移植(POSIX 不要求存在 d_type 成员);此外,并非所有文件系统都支持它,因此您可能会得到 DT_UNKNOWN 。如果你想遵循符号链接,如果你得到 DT_LNK ,你也必须执行额外的检查。在这些情况下,您必须回退到 lstat (见下文);
  • 您可以改为便携式使用 lstat 来获取有关每个文件的信息,特别是检查 st_mode 字段 struct stat

原文由 Matteo Italia 发布,翻译遵循 CC BY-SA 3.0 许可协议

好东西!这是我仅使用 std 的 Windows 友好解决方案,因为我在 Windows 上使用上述解决方案几乎没有什么问题,也适用于 DLL:

  #include <windows.h> // messagebox

 #define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING

 #include <filesystem> // C++17 standard header file name
 #include <experimental/filesystem> // Header file for pre-standard implementation

 using namespace std::experimental::filesystem::v1;

 for (recursive_directory_iterator next(path(dir.c_str())), end; next != end; ++next)
 {
    auto path = next->path();
    if (path.has_extension())
    {
        MessageBox(0, path.wstring().c_str(), L"Filepath", 0);
    }
 }

原文由 binarytrails 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题