Я хотел бы перечислить все файлы в данном каталоге и в его другом подкаталоге. Я нашел код, который я изменил, но он делает бесконечный цикл, и я не понимаю, почему.
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;
}
Как я могу это исправить?
Вероятно, это связано с "." запись каталога возвращается как первая запись, которая представляет текущий каталог.
Это заставляет ваш алгоритм попытаться перечислить записи для. /. а потом. /./. бесконечно повторяя, пока ваша программа не завершится сбоем, когда закончится память.
Там также есть запись "..", которая представляет родительский каталог и может вызвать аналогичную рекурсивную проблему.
Как отметил Джерри Коффин, символические ссылки также могут вызывать очень сходную проблему, если у вас есть ссылки, указывающие на каталог, являющийся родителем или предком символической ссылки. Этого можно избежать при гораздо более сложной проверке или просто просто исключая записи типа 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);
}
}
}