Как проверить, находится ли файл в определенном каталоге или его подкаталогах в C - PullRequest
0 голосов
/ 26 декабря 2018

Я создаю свою собственную оболочку, и мне было интересно: как я могу узнать, находится ли commande в каталоге "/ bin" и его подкаталогах.Я хотел бы реализовать функцию char * path_to_command (char * commandname), которая возвращает путь к команде, указанной в параметрах.

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

Английский не мой родной язык, мне очень жаль, если есть ошибки.Спасибо.

Ответы [ 3 ]

0 голосов
/ 26 декабря 2018

Вы можете не только использовать opendir (3) & readdir (3) & closedir, но вы, вероятно, захотите создать некоторый путь к файлу вstring (используя строковые процедуры, такие как snprintf или asprintf ) и используйте stat (2) или access (2) для нее (поскольку readdir возвращаетзапись в каталоге, чью d_name вы бы объединяли с путем к содержащейся директории).

Вы также можете использовать nftw (3) .

Однако внутриshell, вы просто хотите перебрать компоненты PATH переменной и добавить имя программы к каждому из них.Для этого рекурсивного спуска не требуется.И есть также execvp (3) .

0 голосов
/ 26 декабря 2018

Не пишите рекурсивную функцию самостоятельно, предпочтите использование стандарта nftw :

NAME

nftw -просмотреть дерево файлов

СИНОПСИЯ

#include <ftw.h>

int nftw(const char *path, int (*fn)(const char *,
         const struct stat *, int, struct FTW *), int fd_limit, int flags);

ОПИСАНИЕ

Функция nftw () должна рекурсивно спускаться по иерархии каталоговкорень в пути.

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

0 голосов
/ 26 декабря 2018

вам нужно посмотреть содержимое каталога, посмотреть на функции opendir / readdir / closedir (#include <dirent.h>)

{edit add}

Будьте осторожны, когда вы сканируете содержимое каталога, вы попадете в каталоги "."и "..", не входите в них рекурсивно, потому что "."это текущий каталог, а ".." верхний каталог (кроме "/", где ".." также "/")

...