递归目录读取

时间:2013-04-01 21:48:39

标签: c++ recursion

我正在尝试以递归方式获取目录的所有文件和子文件夹。这是我到目前为止所拥有的。

#include <iostream>
#include "dirent.h"
#include <io.h>

using namespace std;

void listDir(char *directory)
{
    DIR *dir;
    struct dirent *ent;
    if((dir = opendir (directory)) != NULL)
    {
        while ((ent = readdir (dir)) != NULL)
        {
            if(strstr(ent->d_name,".") != NULL)
                cout<<ent->d_name<<endl;
            else
            {
                strcat(directory,ent->d_name);
                strcat(directory,"\\");
                strcat(directory,"\0");
                cout<<directory<<endl;
                cin.get();
                listDir(directory);
            }
        }
    }
    closedir (dir);
}

int main(int param, char **args)
{
    char *path = new char[];
    path = args[1];
    strcat(path, "\\");
    listDir(path);
    cin.get();
    return 0;
}

我正在使用dirent(实际上非​​常酷,如果你还没有得到它)​​,当我递归获取文件夹时,它似乎会添加到我子文件夹末尾的目录中。例如:

下载,图片和包含都是我的Jakes625文件夹的子文件夹。也许我错过了什么?

2 个答案:

答案 0 :(得分:0)

#include <unistd.h>
#include <dirent.h>

#include <iostream>

using namespace std;

void listDir(const string& path)
{
  DIR *dir;
  struct dirent *ent;

  if((dir = opendir (path.c_str())) != NULL)
  {
    while ((ent = readdir (dir)) != NULL)
    {
      if(string(ent->d_name).compare(".") != 0)
      {
        cout<< ent->d_name << endl;
      }
      else
      {
        string nextDir = string(ent -> d_name);
        nextDir += "\\";

        cout <<  nextDir << endl;

        listDir(nextDir);
      }
    }
  }

  closedir (dir);
}

int main(int param, char **args)
{
  string path = string(args[1]);
  listDir(path);

  return 0;
}

我重写了它以便它使用c ++字符串:这里没有理由使用C字符串。它现在有效。存在许多小问题,但最重要的是当您去分配char数组时没有指定大小。这条线是罪魁祸首:

char *path = new char[]; // bad!

如果未指定大小,则分配器不知道从堆请求的字节数。您的程序不需要堆分配,因为不存在数据需要比其封闭的词法块更长的情况。

答案 1 :(得分:0)

https://en.cppreference.com/w/cpp/filesystem/recursive_directory_iterator

    for(auto& p: fs::recursive_directory_iterator("my_directory"))
        std::cout << p.path() << '\n';

这是一个例子

#include <fstream>
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
 
int main()
{
    fs::current_path(fs::temp_directory_path());
    fs::create_directories("sandbox/a/b");
    std::ofstream("sandbox/file1.txt");
    fs::create_symlink("a", "sandbox/syma");
    for(auto& p: fs::recursive_directory_iterator("sandbox"))
        std::cout << p.path() << '\n';
    fs::remove_all("sandbox");
}

输出:

"sandbox/a"
"sandbox/a/b"
"sandbox/file1.txt"
"sandbox/syma"