Назад |
Рассмотрим подробнее информацию, содержащуюся в файле, описывающим директорию. Он состоит из записей, характеризующих содержащиеся в каталоге наборы данных. Для каждого из них указаны имя, возможно некоторые другие атрибуты, и ссылка на элемент в таблице символов узлов. Последнее необходимо для доступа к содержимому файла. С точки зрения прав доступа все пользователи делятся на три категории: владелец файла, пользователи, входящие в одну группу с владельцем, и остальные. Для каждой категории устанавливаются правила на использование файла для чтения, записи и выполнения. Все файлы, описывающие директории, за исключением файла, соответствующего корневой директории, содержат по две записи для имен "." и ". .". Первое из них используется для указания текущей директории, второе - для обозначения директории, являющейся родительской по отношению к текущей. Использование данного имени позволяет "продвигаться" вверх в иерархии файловой системы (см. подробнее, например [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; }
Здесь мы открываем текущий каталог и печатаем его содержимое на экране.