В C как добраться до указанного каталога? - PullRequest
8 голосов
/ 26 октября 2010

Я должен сделать программу, где мне нужно индексировать файлы в указанном каталоге.Я получил часть индексации, но у меня проблемы с тем, как перейти к каталогу.Например, скажем, когда я запускаю программу, она спросит «Какой каталог вы хотите проиндексировать», а затем введите «usr / Documents / CS / Assignment4», как мне попасть в каталог «Assignment4»?Я знаю, что рекурсия необходима, но я действительно не понимаю, как работают каталоги в C. Скажите, что мой исходный файл находится в «usr / Documents / SourceCode», тогда что мне нужно сделать, чтобы попасть в Assignment4?

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

Я использую Linux, если быть точным, Ubuntu.GCC - это компилятор.

Ответы [ 3 ]

7 голосов
/ 26 октября 2010

Язык программирования C не имеет понятия файловой системы.Это вопрос, относящийся к конкретной операционной системе.

Основано на стиле каталога в вашем вопросе, хотя звучит так, будто вы работаете в системе в стиле unix / linux.Если это так, то вам нужна функция opendir

1 голос
/ 26 октября 2010

Рекурсивный обход каталога в C выглядит примерно так:

Используйте opendir и readdir для отображения записей каталога. Я, вероятно, не должен был делать это, но я публикую полный пример кода (без обработки ошибок), потому что есть несколько небольших вещей, которые вы должны сделать, чтобы убедиться, что вы используете API правильно:

DIR           *dir;
struct dirent *de;
const char    *name;

dir = opendir(dirpath);
if (dir == NULL) {
    /* handle error */
}

for (;;) {
    errno = 0;
    de = readdir(dir);
    if (de == NULL) {
        if (errno != 0) {
            /* handle error */
        } else {
            /* no more entries left */
            break;
        }
    }

    /* name of file (prefix it with dirpath to get a usable file path) */
    name = de->d_name;

    /* ignore . and .. */
    if (name[0] == '.' && (name[1] == '\0' || (name[1] == '.' && name[2] == '\0')))
        continue;

    /* do something with the file */
}

if (closedir(dir) != 0) {
    /* handle error */
}

При работе с каждым файлом обязательно добавляйте к нему дирпат (вместе с косой чертой, если необходимо). Вы также можете использовать chdir для спуска и подъема, но на практике это усложняет ситуацию (например, вы не можете перемещаться по двум каталогам одновременно), поэтому я лично рекомендую держать ваш текущий рабочий каталог в неподвижном состоянии и использовать манипуляции со строками для объединения путей. *

Чтобы выяснить, является ли путь каталогом или нет (и, следовательно, следует ли вам opendir() его), я рекомендую использовать lstat() вместо stat(), так как последний следует по символическим ссылкам, что означает, что ваш обход каталога может Вы попадете в цикл, и у вас получится что-то , например, этот вывод ctags .

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

0 голосов
/ 26 октября 2010

Имя каталога - только строка.

So opendir ("имя файла"); сделает возможным чтение каталога "файл".

Однако, возможно, вы должны начать думать в именах файлов и путях.

"usr / Documents / SourceCode" + "/../CS/Assignment4" - это то же самое, что и "usr / Documents / CS / Assignment4", однако я предполагаю, что вам не хватает ведущего "/".

Ну, я не понимаю, как вы можете потеряться, как работают каталоги. Каталог - это ничто иное, как «папка» в Windows или Mac OS X. В итоге жесткий диск имеет файловую систему, а файловая система состоит только из папок / каталогов, которые «содержат» файлы (и специальных файлов, таких как именованные сокеты и т. Д.). , это не должно вас сейчас интересовать).

Надеюсь, это помогло хотя бы немного.

Angelo

...