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

Описание

uses linux;

Function Frename(oldpathname, newpathname:Pchar):Boolean;

Function Frename(oldpathname, newpathname:String):Boolean;

Файл, заданный аргументом oldpathname, получает новое имя, заданное вторым параметром newpathname. Если файл с именем newpathname уже существует, то перед переименованием файла oldpathname он удаляется.

Упражнение 3.8. Напишите свою версию команды rm, используя вызов unlink. Ваша программа должна проверять, имеет ли пользователь право записи в файл при помощи вызова access и в случае его отсутствия запрашивать подтверждение перед попыткой удаления ссылки на файл. (Почему?) Будьте осторожны при тестировании программы!

3.2.4. Символьные ссылки

Существует два важных ограничения на использование вызова link. Обычный пользователь не может создать ссылку на каталог (в некоторых версиях UNIX и суперпользователь не имеет права этого делать), и невозможно создать ссылку между различными файловыми системами (file systems). Файловые системы являются основными составляющими всей файловой структуры UNIX и будут изучаться более подробно в главе 4.

Для преодоления этих ограничений спецификация XSI поддерживает понятие символьных ссылок (symbolic links). Символьная ссылка в действительности представляет собой файл, содержащий вместо данных путь к файлу, на который указывает ссылка. Можно сказать, что символьная ссылка является указателем на другой файл.

Для создания символьной ссылки используется системный вызов symlink:

Описание

uses linux;

Function SymLink(realname, symname:pathstr):Boolean;

После завершения вызова symlink создается файл symname, указывающий на файл realname. Если возникает ошибка, например, если файл с именем symname уже существует, то вызов symlink возвращает значение false. В случае успеха вызов возвращает истинное значение.

Пример использования SymLink:

Uses linux;

Var F : Text;

S : String;

begin

Assign (F,'test.txt');

Rewrite (F);

Writeln (F,'This is written to test.txt');

Close(f);

{ new.txt and test.txt are now the same file }

if not SymLink ('test.txt','new.txt') then

writeln ('Error when symlinking !');

{ Removing test.txt still leaves new.txt

Pointing now to a non-existent file ! }

If not Unlink ('test.txt') then

Writeln ('Error when unlinking !');

Assign (f,'new.txt');

{ This should fail, since the symbolic link

points to a non-existent file! }

{$i-}

Reset (F);

{$i+}

If IOResult=0 then

Writeln ('This shouldn''t happen');

{ Now remove new.txt also }

If not Unlink ('new.txt') then

Writeln ('Error when unlinking !');

end.

Если файл символьной ссылки открывается при помощи fdopen, то системный вызов fdopen корректно прослеживает путь к файлу realname. Если необходимо считать данные из самого файла symname, то нужно использовать системный вызов readlink.

Описание

uses linux;

Function ReadLink(sympath, buffer:pchar; bufsize:longint):longint;

Function ReadLink(name:pathstr):pathstr;

Системный вызов readlink вначале открывает файл sympath, затем читает его содержимое в переменную buffer, и, наконец, закрывает файл sympath. К сожалению, спецификация XSI не гарантирует, что строка в переменной buffer будет заканчиваться нулевым символом. Возвращаемое вызовом readlink значение равно числу символов в буфере или -1 – в случае ошибки.

Следует сделать предупреждение, касающееся использования и прослеживания символьных ссылок. Если файл, на который указывает символьная ссылка, удаляется, то при попытке доступа к файлу при помощи символьной ссылки выдается ошибка, которая может ввести вас в заблуждение. Программа все еще сможет «видеть» символьную ссылку, но, к сожалению, вызов fdopen не сможет проследовать по указанному в ссылке пути и вернет ошибку, установив значение переменной linuxerror равным Sys_EEXIST.

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