Скачиваний:
56
Добавлен:
08.01.2014
Размер:
2.6 Mб
Скачать

4.4. Использование каталогов при программировании

Как уже упоминалось, для работы с каталогами существует особое семейство системных вызовов. Главным образом эти вызовы работают со структурой dirent, которая определена в модуле linux и содержит следующие элементы:

PDirent = ^Dirent;

Dirent = Record

ino, (* Номер индексного дескриптора *)

off : longint;

reclen : word;

name : string[255] (* Имя файла *)

end;

Спецификация XSI не определяет размер name, но гарантирует, что число байтов, предшествующих нулевому символу, будет меньше, чем число, хранящееся в переменной _PC_NAME_MAX, определенной в заголовочном файле <unistd.h>. Обратите внимание, что нулевое значение переменной ino обозначает пустую запись в каталоге.

4.4.1. Создание и удаление каталогов

Как уже упоминалось ранее, каталоги нельзя создать при помощи системных вызовов fdcreat или fdopen. Для выполнения этой задачи существует специальный системный вызов mkdir.

Описание

uses stdio;

function mkdir(pathname:pchar;mode:integer):integer;

Первый параметр, pathname, указывает на строку символов, содержащую имя создаваемого каталога. Второй параметр, mode, является набором прав доступа к каталогу. Права доступа будут изменяться с учетом значения umask процесса, например:

var

retval:integer;

retval := mkdir('/tmp/dir1', octal(0777));

Как обычно, системный вызов mkdir возвращает нулевое значение в случае успеха, и -1 – в случае неудачи. Обратите внимание, что mkdir также помещает две ссылки (. и ..) в создаваемый новый каталог. Если бы этих элементов не было, работать с полученным каталогом было бы невозможно.

Если каталог больше не нужен, то его можно удалить при помощи системного вызова rmdir.

Описание

uses stdio;

function rmdir(pathname:pchar):integer;

Параметр pathname определяет путь к удаляемому каталогу. Этот вызов завершается успехом, только если удаляемый каталог пуст, то есть содержит только записи «точка» (.) и «двойная точка (..).

4.4.2. Открытие и закрытие каталогов

Для открытия каталога UNIX спецификация XSI определяет особую функцию opendir.

Описание

uses linux;

Function OpenDir(dirname:pchar):pdir;

Function OpenDir(dirname:string):pdir;

Передаваемый вызову opendir параметр является именем открываемого каталога. При успешном открытии каталога dirname вызов opendir возвращает указатель на переменную типа TDIR. Определение типа TDIR, представляющего дескриптор открытого каталога, находится в модуле linux. Это определение аналогично определению типа TFILE, используемого в стандартной библиотеке ввода/вывода, описанной в главах 2 и 11. Указатель позиции ввода/вывода в полученном от функции opendir дескрипторе установлен на первую запись каталога. Если вызов завершился неудачно, то функция возвращает nil. Всегда следует проверять возвращаемое значение, прежде чем это значение может быть использовано.

После того, как программа закончит работу с каталогом, она должна закрыть его. Это можно сделать при помощи функции closedir.

Описание

uses linux;

Function CloseDir(dirptr:pdir):integer;

Функция closedir закрывает дескриптор открытого каталога, на который указывает аргумент dirptr. Обычно его значение является результатом предшествующего вызова opendir, что демонстрирует следующий пример:

uses linux;

var

dp:pdir;

begin

dp := opendir ('/tmp/dir1');

if dp = nil then

begin

writeln('Ошибка открытия каталога /tmp/dir1');

halt(1);

end;

(*

Код, работающий с каталогом

.

.

.

*)

closedir (dp);

end.

Соседние файлы в папке Полищук, Семериков. Системное программирование в UNIX средствами Free Pascal