<b>#include <unistd.h></b><b>int chdir(const char *path);</b>Программа может определить свой текущий рабочий каталог, вызвав функцию
getcwd<b>#include <unistd.h></b><b>char *getcwd(char *buf, size_t size);</b>Функция
getcwdbufNULLERANGEsizebufФункция
getcwdNULLEINVALEACCESSПросмотр каталогов
Широко распространенная проблема систем Linux — просмотр каталогов, т.е. определение файлов, размещенных в конкретном каталоге. В программах командной оболочки она решается легко — просто скомандуйте оболочке выполнить подстановку в выражении с метасимволами. В прошлом в разных вариантах UNIX был разрешен программный доступ к низкоуровневой структуре файловой системы. Вы все еще можете открывать каталог как обычный файл и непосредственно считывать элементы каталога, но разные структуры файловых систем и реализации сделали такой подход непереносимым с машины на машину. Был разработан стандартный комплект библиотечных функций, существенно упрощающий просмотр каталогов.
Функции работы с каталогами объявлены в заголовочном файле dirent.h. В них используется структура
DIRDIR*FILE*DIRМы рассмотрим следующие функции:
□
opendirclosedir□
readdir□
telldir□
seekdir□
closediropendir
Функция
opendirDIR<b>#include <sys/types.h></b><b>#include <dirent.h></b><b>DIR *opendir(const char *name);</b>В случае неудачи функция opendir возвращает пустой указатель. Имейте в виду, что для доступа к самому каталогу поток каталога использует низкоуровневый дескриптор файла, поэтому opendir может дать сбой, если открыто слишком много файлов.
readdir
Функция
readdirdirpreaddirreaddirNULLNULLerrno<b>#include <sys/types.h></b><b>#include <dirent.h></b><b>struct dirent *readdir(DIR *dirp);</b>Просмотр каталога с помощью функции
readdirВ состав структуры
dirent□
ino_t d_ino□
char d_name[]Для выяснения других реквизитов файла в каталоге вам необходимо вызвать
stattelldir
Функция
telldirseekdir<b>#include <sys/types.h></b><b>#include <dirent.h></b><b>long int telldir(DIR *dirp);</b>seekdir
Функция
seekdirdirploctelldir<b>#include <sys/types.h></b><b>#include <dirent.h></b><b>void seekdir (DIR *dirp, long int loc);</b>closedir
Функция
closedir<b>#include <sys/types.h></b><b>#include <dirent.h></b><b>int closedir(DIR *dirp);</b>В приведенной далее программе printdir.c (упражнение 3.4) вы соберете вместе множество функций обработки файлов для создания простого перечня содержимого каталога. Каждый файл представлен отдельной строкой. У каждого подкаталога есть имя, за которым следует слэш, и файлы, содержащиеся в подкаталоге, выводятся с отступом шириной в четыре пробела.