Найти все файлы в каталоге и его подкаталоге

0

Я хотел бы перечислить все файлы в данном каталоге и в его другом подкаталоге. Я нашел код, который я изменил, но он делает бесконечный цикл, и я не понимаю, почему.

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
    Есть ли шанс, что у вас есть что-то вроде символической ссылки из каталога на какой-либо родительский элемент этого каталога?
Теги:
file
folder

1 ответ

4
Лучший ответ

Вероятно, это связано с "." запись каталога возвращается как первая запись, которая представляет текущий каталог.

Это заставляет ваш алгоритм попытаться перечислить записи для. /. а потом. /./. бесконечно повторяя, пока ваша программа не завершится сбоем, когда закончится память.

Там также есть запись "..", которая представляет родительский каталог и может вызвать аналогичную рекурсивную проблему.

Как отметил Джерри Коффин, символические ссылки также могут вызывать очень сходную проблему, если у вас есть ссылки, указывающие на каталог, являющийся родителем или предком символической ссылки. Этого можно избежать при гораздо более сложной проверке или просто просто исключая записи типа 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);
        }
    }
}
  • 0
    @bandera Попробуйте отредактированную версию

Ещё вопросы

Сообщество Overcoder
Наверх
Меню