Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учеб.пос.СП.doc
Скачиваний:
28
Добавлен:
31.03.2015
Размер:
1.33 Mб
Скачать
    1. Каталоги

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

Рассмотрим стандартные способы чтения содержимого каталогов с помощью системных вызовов:

opendir - открывает каталог

#include <dirent.h>

DIR * opendir(

const char *path /* имя каталога */

);

/* Возвращает указатель на DIR или NULL в случае ошибки (код ошибки - в переменной errno) */

closedir - открывает каталог

#include <dirent.h>

int closedir (

DIR *dirp /* указатель на DIR, полученный от opendir */

);

/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки - в переменной

errno) */

readdir - читает запись из каталога

#include <dirent.h>

struct dirent * readdir (

DIR *dirp /* указатель на DIR, полученный от opendir */

);

/* Возвращает указатель на структуру или NULL по достижении конца каталога или в случае ошибки (код ошибки - в переменной errno) */

struct dirent - структура для размещения одной записи вызовом readdir

struct dirent {

ino_t d_ino; /* номер индексного узла */

char d_name[]; /* имя */

};

rewinddir - переход в начало каталога

#include <dirent.h>

void rewinddir (

DIR *dirp /* указатель DIR, полученный от opendir */

);

seekdir - переход к требуемому местоположению

#include <dirent.h>

void seekdir (

DIR *dirp, /* указатель DIR, полученный от opendir */

long loc /* местоположение */

);

telldir - получить текущую позицию в каталоге

#include <dirent.h>

long telldir (

DIR *dirp, /* указатель DIR, полученный от opendir */

);

Назначение этих функций следующее: работа с каталогом начинается с вызова opendir, который возвращает указатель на структуру DIR. Затем этот указатель используется как аргумент во всех остальных функциях. Для чтения содержимого каталога, в цикле вызывается readdir до тех пор, пока он не вернет NULL. Если содержимое переменной errno не изменилось, то это означает, что достигнут конец каталога. Структура dirent, которую возвращает readdir, содержит номер индексного узла и имя элемента каталога. По окончании работы с каталогом он закрывается вызовом closedir. Вызов rewinddir необходим, когда нужно возобновить чтение каталога с самого начала, не закрывая и повторно не открывая его.

      1. Системные вызовы chdir и fchdir

Представим следующие системные вызовы:

chdir - делает заданный каталог текущим

#include <unistd.h>

int chdir (

const char *path /* имя каталога */

);

/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки - в переменной

errno) */

fchdir - делает текущим каталог по дескриптору

#include <unistd.h>

int fchdir (

int fd /* дескриптор файла */

);

/* Возвращает 0 в случае успеха, -1 в случае ошибки (код ошибки - в переменной

errno) */

Аргумент системного вызова chdir может быть и абсолютным, и относительным маршрутом к каталогу.