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

3.2.5. Еще об именах файлов

Для выделения из имени файла его частей можно воспользоваться функциями:

Описание

uses linux;

Function BaseName(Const Path;Const Suf:Pathstr):Pathstr;

Function DirName(Const Path:Pathstr):Pathstr;

Procedure FSplit(const Path:PathStr; var Dir:DirStr; Var Name:NameStr;

Var Ext:ExtStr);

BaseName выделяет из полного пути Path имя файла, обрезая окончание Suf, если оно существует. Для каталогов завершающий слэш всегда убирается (за исключением корневого каталога).

DirName возвращает часть пути, соответствующую имени каталога. Это будет часть параметра Path до завершающего слэша, или ничего в его отсутствие.

FSplit разбивает полное имя файла на 3 части: путь Path, имя Name и расширение ext. Расширением считаются все символы, следующие за последней точкой.

Например:

uses Linux;

var

Path,Name,Ext : string;

begin

FSplit(ParamStr(1),Path,Name,Ext);

WriteLn('Split ',ParamStr(1),' in:');

WriteLn('Path : ',Path);

WriteLn('Name : ',Name);

WriteLn('Extension: ',Ext);

end.

3.3. Получение информации о файле: вызов fstat

До сих пор были лишь рассмотрены вопросы, как можно установить или изменить основные связанные с файлами свойства. Системный вызов fstat позволяет процессу определить значения этих свойств в существующем файле.

Описание

uses linux;

Function FStat(Path:Pathstr;Var Info:tstat):Boolean;

Function FStat(Fd:longint;Var Info:tstat):Boolean;

Function FStat(var F:Text;Var Info:tstat):Boolean;

Function FStat(var F:File;Var Info:tstat):Boolean;

Function LStat(Path:Pathstr; Var Info:tstat):Boolean;

Системный вызов fstat имеет два аргумента: первый из них – path, как обычно, указывает на полное имя файла. Второй аргумент info является ссылкой на структуру tstat (stat). Эта структура после успешного вызова будет содержать связанную с файлом информацию. Вместо имени файла может также использоваться его дескриптор или файловая переменная.

.

.

.

var

s:tstat;

filedes:integer;

retval:boolean;

filedes := fdopen('/tmp/dina', Open_RDWR);

(* Структура s может быть заполнена при помощи вызова ... *)

retval := fstat('/tmp/dina', s);

/* ... или */

retval := fstat(filedes, @s);

Определение структуры tstat находится в модуле linux и включает следующие элементы:

stat=record

dev : word;

pad1 : word;

ino : longint;

mode : word;

nlink : word;

uid : word;

gid : word;

rdev : word;

pad2 : word;

size : longint;

blksze : Longint;

blocks : Longint;

atime : Longint;

unused1 : longint;

mtime : Longint;

unused2 : longint;

ctime : Longint;

unused3 : longint;

unused4 : longint;

unused5 : longint;

end;

Системный вызов lstat получает информацию о символьной ссылке. Например:

uses linux;

var f : text;

i : byte;

info : stat;

begin

{ Make a file }

assign (f,'test.fil');

rewrite (f);

for i:=1 to 10 do writeln (f,'Testline # ',i);

close (f);

{ Do the call on made file. }

if not fstat ('test.fil',info) then

begin

writeln('Fstat failed. Errno : ',linuxerror);

halt (1);

end;

writeln;

writeln ('Result of fstat on file ''test.fil''.');

writeln ('Inode : ',info.ino);

writeln ('Mode : ',info.mode);

writeln ('nlink : ',info.nlink);

writeln ('uid : ',info.uid);

writeln ('gid : ',info.gid);

writeln ('rdev : ',info.rdev);

writeln ('Size : ',info.size);

writeln ('Blksize : ',info.blksze);

writeln ('Blocks : ',info.blocks);

writeln ('atime : ',info.atime);

writeln ('mtime : ',info.mtime);

writeln ('ctime : ',info.ctime);

If not SymLink ('test.fil','test.lnk') then

writeln ('Link failed ! Errno :',linuxerror);

if not lstat ('test.lnk',info) then

begin

writeln('LStat failed. Errno : ',linuxerror);

halt (1);

end;

writeln;

writeln ('Result of fstat on file ''test.lnk''.');

writeln ('Inode : ',info.ino);

writeln ('Mode : ',info.mode);

writeln ('nlink : ',info.nlink);

writeln ('uid : ',info.uid);

writeln ('gid : ',info.gid);

writeln ('rdev : ',info.rdev);

writeln ('Size : ',info.size);

writeln ('Blksize : ',info.blksze);

writeln ('Blocks : ',info.blocks);

writeln ('atime : ',info.atime);

writeln ('mtime : ',info.mtime);

writeln ('ctime : ',info.ctime);

{ Remove file and link }

erase (f);

unlink ('test.lnk');

end.

Элементы структуры stat имеют следующие значения:

– dev, ino

Первый из элементов структуры описывает логическое устройство, на котором находится файл, а второй задает номер индексного дескриптора (inode number), который вместе с dev однозначно определяет файл. Фактически и dev, и ino относятся к низкоуровневому управлению структурой файлов UNIX. Эти понятия будут рассмотрены в следующей главе.

– mode

Этот элемент задает режим доступа к файлу и позволяет программисту вычислить связанные с файлом права доступа. Здесь следует сделать предостережение. Значение, содержащееся в переменной mode, также дает информацию о типе файла, и только младшие 12 бит относятся к правам доступа. Это станет очевидно в главе 4.

– nlink

Число ссылок, указывающих на этот файл (другими словами, число различных имен файла, так как жесткие ссылки неотличимы от «настоящего» имени). Это значение обновляется при каждом системном вызове link и unlink.

– uid, gid

Идентификаторы пользователя uid и группы gid файла. Первоначально устанавливаются вызовом fdcreat и изменяются системным вызовом chown

– rdev

Этот элемент имеет смысл только в случае использования файла для описания устройства. На него пока можно не обращать внимания.

– size

Текущий логический размер файла в байтах. Нужно понимать, что способ хранения файла определяется реальными параметрами устройства, и поэтому физический размер занимаемого пространства может быть больше, чем логический размер файла. Элемент size изменяется при каждом вызове fdwrite в конце файла.

– atime

Содержит время последнего чтения из файла (хотя первоначальные вызов fdcreat и fdopen устанавливают это значение).

– mtime

Указывает время последней модификации файла – изменяется при каждом вызове fdwrite для файла.

– ctime

Содержит время последнего изменения информации, возвращаемой в структуре stat. Это время изменяется системными вызовами link (меняется элемент nlink), chmod (меняется mode) и fdwrite (меняется mtime и, возможно, size).

– blksize

Содержит размер блока ввода/вывода, зависящий от настроек системы. Для некоторых систем этот параметр может различаться для разных файлов.

– blocks

Содержит число физических блоков, занимаемых определенным файлом.

Системный вызов utime позволяет установить время доступа и модификации файла. Структура utimbuf содержит два поля, actime и modtime, оба типа Longint. Они должны быть заполнены значениями времени в секундах с 1.1.1970 г. относительно последнего времени доступа и последнего времени модификации.

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