【问题标题】:How can I generate a directory tree from a root folder and all it's sub folders?如何从根文件夹及其所有子文件夹生成目录树?
【发布时间】:2011-04-20 07:28:05
【问题描述】:

好的,所以我正在尝试获取文件夹和子文件夹的目录,但它只是进入了无限循环。创建文件夹和子文件夹目录的更好方法是什么?因为我真的不知道。

这是我目前的代码:

#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <errno.h>
#include <vector>
#include <string>
#include <iostream>

using namespace std;

struct Directory{
  public:
        int indent;
        vector<string> files;
        vector<string> folders;
        string dir;
        Directory(string mydir){ dir = mydir;}
};

int getfolders (string dir, vector<string> &folders)
{
    DIR *dp;
    struct stat st;
    struct dirent *dirp;
    if((dp  = opendir(dir.c_str())) == NULL) {
        cout << "Error(" << errno << ") opening " << dir << endl;
        return errno;
    }

    while ((dirp = readdir(dp)) != NULL) {
        stat(dirp->d_name, &st);

        if(S_ISDIR(st.st_mode)){
            if(dirp->d_name[0] != '.')
                folders.push_back(string(dirp->d_name));
        }
    }
    closedir(dp);
    return 0;
}

/*function... might want it in some class?*/
int getfiles (string dir, vector<string> &files)
{

    DIR *dp;
    struct stat st;
    struct dirent *dirp;
    if((dp  = opendir(dir.c_str())) == NULL) {
        cout << "Error(" << errno << ") opening " << dir << endl;
        return errno;
    }

    while ((dirp = readdir(dp)) != NULL) {
        stat(dirp->d_name, &st);

        if(!S_ISDIR(st.st_mode)){
            files.push_back(string(dirp->d_name));
        }
    }
    closedir(dp);
    return 0;
}

int main()
{
    struct Directory root = Directory(".");


    vector<string> display = vector<string>();

    cout << "hello\n";

    getfiles(root.dir,root.files);
    getfolders(root.dir,root.folders);

    cout << "hello\n";

    vector<Directory> dirs = vector<Directory>();

    for(int i = 0; i < (int) root.folders.size(); i++){
        dirs.push_back(Directory(root.folders[i]));

       getfiles(dirs[i].dir,dirs[i].files);
        getfolders(dirs[i].dir,dirs[i].folders);


        //infinate loop start
        for(int j = 0; j < (int) dirs[i].folders.size(); j++){
            dirs.push_back(Directory(dirs[i].folders[j]));

            getfiles(dirs[i].dir,dirs[i].files);
            getfolders(dirs[i].dir,dirs[i].folders);
        }
        //infinate loop end
    }

    cout << "hello\n";

    for (int i = 0; i < (int) root.folders.size();i++) {
        cout << root.folders[i] << endl;
        for(int j = 0; j < (int) dirs[i].folders.size(); j++){
            cout << dirs[i].folders[j] << endl;
        }
    }
    return 0;
}

【问题讨论】:

    标签: c++ tree directory dirent.h


    【解决方案1】:

    我认为您必须以不同的方式处理指向目录的符号链接。您的无限循环可能有来源:

    假设 /tmp/foo 是 /tmp 的符号链接,那么我认为你的程序会在 .==/tmp 时进入无限循环

    【讨论】:

    • 感谢您的回复。是的,这就是无限循环的原因,但我想不出另一种方法来处理子文件夹,这就是我要问的问题。 ^_^
    • 我认为,我会将指向目录的符号链接作为文件而不是目录来处理。因为否则,您可能会离开源目录并进入文件系统的完全不同的部分。如果您必须取消引用符号链接,请将您已经访问过的目录名称列表保存在全局数组中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    相关资源
    最近更新 更多