我想列出给定目录及其不同子目录中的所有文件。 我找到了一些我修改过的代码,但它做了一个永无止境的循环,我不明白为什么。
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;
}
我该如何解决?
答案 0 :(得分:4)
这可能是由于&#34;。&#34;目录条目作为表示当前目录的第一个条目返回。
这会导致您的算法尝试列出./的条目。然后 。/。/。无休止地重复,直到你的程序在内存不足时最终崩溃。
还有一个&#34; ..&#34;目录条目,表示父目录,可能导致类似的递归问题。
如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);
}
}
}