c: вернуть все имена файлов в каталоге - PullRequest
1 голос
/ 28 октября 2011

Как написать функцию, которая возвращает все имена файлов в каталоге, включая файлы в подкаталогах.Пока что у меня есть что-то подобное, но это не работает правильно, я пытаюсь вызвать эту функцию и распечатать каждый элемент, он печатает только первый элемент.другой подход написания этой функции?

char **allFiles(char *dir, OPTIONS opts) {
        char **allfiles = malloc(sizeof(char **));
        struct dirent *dp;

        while((dp = readdir(dirp)) != NULL) {

            if (strcmp(dp->d_name, ".") == 0 || strcmp(dp->d_name, "..") == 0)
                continue;
            if (dp->d_type == DT_DIR)
                allfiles = allFiles(strcat(strcat(dir, "/"), dp->d_name));

            if (dp->d_type != DT_DIR)
                *allfiles = strdup(strcat(strcat(strdup(dir), "/"), dp->d_name));

            ++allfiles;
        }
    closedir(dirp);
    return allfiles;
}

Ответы [ 3 ]

2 голосов
/ 28 октября 2011

Массив allfiles [] заполняется как родителем, так и рекурсивным потомком. Дочерний элемент вставляется в него, но результаты перезаписываются родителем.

ОБНОВЛЕНИЕ: после перечитывания я вижу, что управление массивом выглядит хорошо (помимо возможного превышения его конца) Может быть, у вас закончились файловые дескрипторы?

ОБНОВЛЕНИЕ2: заменить

if (dp->d_type != DT_DIR)
        *allfiles = strdup(strcat(strcat(strdup(dir), "/"), dp->d_name));
        ++allfiles;

Автор:

if (dp->d_type != DT_DIR)
        *allfiles++ = strdup(strcat(strcat(strdup(dir), "/"), dp->d_name));
0 голосов
/ 28 октября 2011

Увеличение указателя allfiles не может быть выполнено, потому что вы только выделили место для удержания 1 указателя (до char *).Другая проблема заключается в том, что allfiles перезаписывается при обнаружении каталога (таким образом теряются все предыдущие найденные файлы и каталоги).

0 голосов
/ 28 октября 2011

Рассматривали ли вы возможность использования glob () , если она есть на вашей платформе?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...