Назад

Содержание

Вперед


1.4.2. Работа с каталогами.

    Рассмотрим подробнее информацию, содержащуюся в файле, описывающим директорию. Он состоит из записей, характеризующих содержащиеся в каталоге наборы данных. Для каждого из них указаны имя, возможно некоторые другие атрибуты, и ссылка на элемент в таблице символов узлов. Последнее необходимо для доступа к содержимому файла. С точки зрения прав доступа все пользователи делятся на три категории: владелец файла, пользователи, входящие в одну группу с владельцем, и остальные. Для каждой категории устанавливаются правила на использование файла для чтения, записи и выполнения. Все файлы, описывающие директории, за исключением файла, соответствующего корневой директории, содержат по две записи для имен "." и ". .". Первое из них используется для указания текущей директории, второе - для обозначения директории, являющейся родительской по отношению к текущей. Использование данного имени позволяет "продвигаться" вверх в иерархии файловой системы (см. подробнее, например [3,4].

    Директории создаются системным вызовом mkdir( ) и удаляются rmdir( ). Если директория не является пустой , т.е. содержит некоторое количество файлов, удалить ее нельзя. Формат функций, реализующих эти системные вызовы, следующий:

#include <sys/types.h>
#include <sys/stat.h>

int mkdir (const char *path, mode_t mode);
int rmdir (const char *path);

    Аргументы функций следующие: path - имя директории, mode - целое число, задающее атрибуты создаваемого каталога. Задание их производится при помощи побитовых логических операций со следующими символическими константами, которые определяют установку прав доступа:

S_IRWXU Владелец может читать, писать и выполнять.
S_IRUSR Владелец может читать.
S_IWUSR Владелец может писать.
S_IXUSR Владелец может выполнять.
S_IRWXG Пользователи, входящие в одну группу с владельцем (группа), могут читать, писать и выполнять.
S_IRGRP Группа может читать.
S_IWGRP Группа может писать.
S_IXGRP Группа может выполнять.
S_IRWXO Все остальные пользователи (остальные) могут читать, писать и выполнять.
S_IROTH Остальные могут читать.
S_IWOTH Остальные могут писать.
S_IXOTH Остальные могут выполнять.

    Прочитать содержимое каталога, т.е. получить перечень имеющихся в нем поддиректорий и файлов, можно при помощи функций:

#include <sys/dir.h>

DIR *opendir (char *dirname);
struct direct *readdir (DIR *dirp);
int closedir (DIR *dirp);

    (Заметим, что процедуры системно-зависимы. Так, например, в диалекте Solaris 2.x (SunSoft), соответствующем стандарту System V Release 4, вместо файла "sys/dir.h" используется "dirent.h", а вместо структуры direct - структура dirent).

    Функция opendir( ) открывает каталог для чтения. Ее параметр dirname - это имя директории. Возвращает процедура указатель на структуру типа DIR, которая затем используется при работе.

    Функция readdir( ) читает содержимое очередного элемента каталога. Процедура возвращает указатель на структуру direct, описывающую файл, либо NULL, если вся информация уже получена. Структура direct определена следующим образом:

struct direct {
    ino_t d_ino; /*Номер индексного узла */
    char d_name [DIRSIZ]; /* Имя файла */
};

Функция closedir( ) закрывает каталог и освобождает необходимые для работы с ним ресурсы.

В следующем примере иллюстрируется приведенный выше материал.

#include <stdio.h>
#include <dirent.h>

vold main( ) {
    DIR *dirp;
    struct direct *directp;
    
    dirp = opendir ( ".");
    while ( (directp = readdir (dirp) ) != NULL)
        (void) printf ( "%s\n", directp->d_name );
    (void) closedir (dirp);
    return 0;
}

Здесь мы открываем текущий каталог и печатаем его содержимое на экране.