【问题标题】:Find all files in a directory and its subdirectory查找目录及其子目录中的所有文件
【发布时间】:2014-06-14 15:46:11
【问题描述】:

我想列出给定目录及其不同子目录中的所有文件。 我发现了一些我修改过的代码,但它执行了一个永无止境的循环,我不明白为什么。

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

    while ((dirp = readdir(dp)) != NULL) {
        files.push_back(string(dirp->d_name));
        string test=dir+"/"+dirp->d_name;
        getdir(test,files);
    }
    closedir(dp);
    return 0;
}

我的主要:

int main()
{
    string dir = string(".");
    vector<string> files = vector<string>();

    getdir(dir,files);

    for (unsigned int i = 0;i < files.size();i++) {
        cout << files[i] << endl;
    }
    return 0;
}

我该如何解决?

【问题讨论】:

  • 你有没有机会从一个目录返回到该目录的某个父目录的符号链接?

标签: c++ file directory


【解决方案1】:

这可能是由于“。”目录条目作为代表当前目录的第一个条目返回。

这会导致您的算法尝试列出 ./ 的条目。进而 。/。/。无休止地重复,直到您的程序在内存不足时最终崩溃。

还有一个“..”目录条目,它代表父目录,可能会导致类似的递归问题。

正如 Jerry Coffin 所指出的,如果您的链接指向的目录是符号链接的父级或祖先目录,则符号链接也会导致非常类似的问题。这可以通过更复杂的检查来避免,或者只是简单地排除 DT_LNK 类型的条目。

另一个问题是您尝试在文件和子目录上调用 getdir。

尝试以下更改

while ((dirp = readdir(dp)) != NULL) {
    string name(dir->d_name);
    if (name != "." && name != "..") {
        string test=dir+"/"+name;
        files.push_back(test);
        if (dir->d_type == DT_DIR) {
            getdir(test,files);
        }
    }
}

【讨论】:

    最近更新 更多