我正在尝试以递归方式获取目录的所有文件和子文件夹。这是我到目前为止所拥有的。
#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文件夹的子文件夹。也许我错过了什么?
答案 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"