Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на Pascal / Delphi / Справочник по компонентам Delphi.doc
Скачиваний:
104
Добавлен:
02.05.2014
Размер:
1 Mб
Скачать

Функции работы с файлами

Эта часть библиотеки претерпела изменения в Delphi. К функциям, которые работали с файлом через файловую переменную, добавились функции, рабо­тающие с дескриптором файла. Они рассматривают файл как двоичный; с текстовыми файлами нужно работать "по старинке".

Файловые функции, описанные в модуле SYSUTILS, приведены в таблице:

function File0pen(const FileName: string; Mode: Word) : Integer;

Открывает существующий FileName файл в режиме Mode (см. примеч. 1). Значение, возвра­щаемое в случае успеха, — дескриптор открытого файла. В противном случае — код ошибки DOS.

function FileCreate(const PileName: string): Integer;

Создает файл с именем FileName. Возвращает то же, что и FileOpen.

function FileRead(Handle: Integer; var Buffer; Count: Longint): Longint;

Считывает из файла с дескриптором Handle Count байт в буфер Buffer. Возвращает число реально прочитанных байт или -1 при ошибке.

function FileWrite(Handle: Integer; const Buffer;

Записывает в файл с дескриптором Handle Count байт из буфера Buffer. Возвращает число реально записанных байт или -1 при ошибке.

function FileSeek(Handle: Integer; Offset: Longint; Origin: Integer): Longint;

Позиционирует файл с дескриптором Handle в новое положение. При Origin = 1,2,3 положение смещается на Offset байт от начала файла, текущей позиции и конца файла соответственно. Возвращает новое положение или -1 при ошибке.

procedure FileClose(Handle:

Закрывает файл с дескриптором Handle.

function FileAge(const

Возвращает значения даты и времени создания файла или -1, если файл не существует.

function FileExists(const

Возвращает True если файл FileName существует к найден.

function FindFirst(const Path: string; Attr: Integer; var SearchRec: TSearchRec): Integer;

Ищет первый файл, удовлетворяющий маске поиска, заданной в Path и с атрибутами Attr (см. примеч. 2). В случае успеха заполняет запись SearchRec (см. примеч. 3) и возвращает 0, иначе возвращает код ошибки DOS.

function FindNext(var SearchRec: TSearchRec): Integer;

Продолжает процесс поиска файлов, удовлетворяющих маске поиска. Параметр SearchRec должен быть заполнен при помощи FindFirst. Возвращает 0, если очередной файл найден, или код ошибки DOS. Изменяет SearchRec.

procedure FindClose(var

Завершает процесс поиска файлов, удовлетворяющих маске поиска.

function FileQetDate(Handle: Integer) : Longint;

Возвращает время создания файла с дескриптором Handle (в формате DOS) или -1, если дескриптор недействителен.

procedure

FileSetDate(Handle: Integer;

Устанавливает время создания файла с дескриптором Handle (в формате DOS).

function FileGetAttr(const FileName: string): Integer;

Возвращает атрибуты (см. примеч. 2) файла с именем FileName или код ошибки DOS, если файл не найден.

function FileSetAttrtconst FileName: string; Attr:

Устанавливает атрибуты файла с именем FileName.

function DeleteFile(const

Уничтожает файл с именем FileName и в случае успеха возвращает True.

function RenameFile(const OldName, NewName: string): Boolean;

Переименовывает файл с именем OldName в NewName и возвращает True в случае успеха.

function ChangeFileExt(const FileName, Extension: string): string;

Изменяет расширение в имени файла FileName на Extension и возвращает новое значение FileName. Имя файла не изменяется.

function ExtractFilePath(const FileName: string): string;

Извлекает из строки с полным именем файла FileName часть, содержащую путь к нему.

function ExtractFileName(const FileName: string): string;

Извлекает из строки с полным именем файла FileName часть, содержащую его имя и расширение.

function ExtractFileExt(const FileName: string): string;

Извлекает из строки с полным именем файла FileName часть, содержащую его расширение.

function ExpandFileName(const FileName: string): string;

Возвращает полное имя файла FileName, добавляя при необходимости путь к нему и переводя все символы в верхний регистр.

function FileSearch(const Name, DirList: string): strings-

Производит поиск файла с именем Name в группе каталогов, заданных параметром DirList. Имена каталогов должны отделяться друг от друга точкой с запятой. Возвращает в случае успеха полное имя файла или пустую строку, если файл не найден.

function DiskFree(Drive: Byte): Longint;

Возвращает количество в байтах свободного места на заданном диске. Значение параметра Drive: 0 — для текущего диска, 1 — для А, 2 — для В и т. д. Если параметр неверен, функция возвращает -1.

function DiskSize(Drive: Byte): Longint;

Возвращает размер диска Drive в байтах. Параметр Drive означает то же, что и в DiskFree.

function FileDateToDateTime(FileDate: Longint): TDateTime;

Преобразует дату и время в формате DOS в принятый в Delphi формат TDateTime.

function DateTimeToFileDate(DateTime: TDateTime): Longint;

Преобразует дату и время из формата TDateTime в формат DOS.

Примечания:

1. Допустимы следующие режимы открытия файлов:

*

Режим

Значение

Что означает

fmOpenRead

$0000

Открыть только для чтения.

fmOpenWrite

$0001

Открыть только для записи.

fmOpenReadWrite

$0002

Открыть для чтения и записи.

fmShareCompat

$0000

Обеспечить совместимость со старой моделью доступа к файлам.

Режим

Значение

Что означает

fmShareExclusive

$0010

Запретить другим доступ к файлу.

fmShareDenyWrite

$0020

Запретить другим запись в файл.

fmShareDenyRead

$0030

Запретить другим чтение файла.

fmShareDenyNone

$0040

Разрешить другим все виды доступа.

2. Файлы могут иметь следующие атрибуты:

faReadOnly = $01;

faHidden = $02;

faSysFile = $04;

faVolumeID = $08;

faDirectory = $10;

faArchive = $20;

faAnyFile = $3F;

3. Формат структуры TSearchRec таков:

TSearchRec = record

Fill: array[1..21] of Byte;

Attr: Byte;

Time: Longint;

Size: Longint;

Name: string[12] ;

end;

Приведем типовой вариант организации групповой обработки файлов при помощи функций FindFirst, FindNext и FindClose. В нем в список добав­ляются имя и длина всех файлов в каталоге с именем CADELPHI:

var SearchRec: TSearchRec;

I : Integer;

List : TStringList;

begin

List := TStringList.Create;

I := FindFirst('c:\delphi\*.*', faAnyFile, SearchRec);

while I = 0 do begin

List.Add(Format (' File %s has length %d bytes ', [SearchRec.Name, SearchRec.Size])) ;

I := FindNext(SearchRec);

end;

FindClose(SearchRec) ;

List.Free;

end;

При поиске файла наиболее вероятным является код ошибки -18 (файл не найден).

Процедура FindClose не делает ничего в 16-разрядной версии Delphi, однако будет играть роль в 32-разрядной. Употреблять ее следует из соображений переносимости приложений.

4 Ряд "старых" функций переименованы: это связано с появлением одно­именных методов у объектов. Теперь вместо Assign следует употреблять AssignFile, вместо Close — CloseFile. Старые имена поддерживаются ддя совместимости, но могут вызвать проблемы при одновременном употреб­лении с именами методов.

2.14.3. Функции форматирования строк

Еще со времен языка FORTRAN у программистов появилась необходимость форматировать строки, направляемые на устройства вывода. Требовался легкий способ для того, чтобы не просто преобразовать число в строку, но также объединить эту строку с другими и включить ее в состав целого предложения.

В Delphi существует группа функций форматирования строк. Их рассмотрение начнем с наиболее часто встречающегося представителя — функции Format:

function Format (const Format: string; const Args: array of const) : string;

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

Второй параметр функции Format называется списком аргументов. Он и со­держит "вставляемые" в форматирующую строку параметры. Обратите внимение, что этот открытый массив имеет тип array of const. и в нем может передаваться переменное число разнотипных параметров. Например, после выполнения

S := FormatC Product %s , version %d.%d', [ 'Borland Delphi' , 1, 0]);

строке S будет присвоено • Product Borland Delphi , version 1.0'. Рассмотрим подробнее правила, по которьм составляется форматирующая строка.

"Специальные" места в ней называются спецификаторами формата и пред­ставляют собой следующие конструкции

"%" [index":"] ["-"I [width] ["."prec] type

где обозначены:

• символ -%", с которого начинаются все спецификаторы формата (обяза­тельный);

• поле индекса аргумента [ index " : " ] (необязательное);

• признак выравнивания по левому краю ["-"I (необязательный);

• поле ширины [width] (необязательное);

• поле точности [ - . - prec ] (необязательное);

• символ типа преобразования type (обязательный).

Каждый спецификатор формата соответствует как минимум одному из эле­ментов списка аргументов и определяет, как именно рассматривать его и преобразовывать в строку.

Функция Format поддерживает следующие символы типа преобразования:

Символ

Тип

Что означает

d

Десятичный

Элемент должен быть целым числом и преобразуется в строку десятичных цифр. Если при символе есть поле точности, то в выходной строке будет минимум ргес цифр; если при преобразовании числа их потребуется меньше, то строка дополняется слева нулями.

х

Шестнадца­тиричный

Как тип d, но элемент преобразуется в строку шестнад­цатиричных цифр.

е

Научный

Элемент должен быть числом с плавающей точкой. Он преобразуется к нормализованному виду -d.dddE+ddd. Перед десятичной точкой всегда находится одна цифра (при необходимости, с минусом). После символа "Е" идет показатель степени, имеющий знак и состоящий не менее чем из 3 цифр. Общее число символов в представлении числа определяется полем ргес (по умолчанию 15).

f

Фиксиро­ванный

Элемент должен быть числом с плавающей точкой. Он преобразуется к виду -ddd.ddd. Поле ргес означает количество цифр после десятичной точки (по умолчанию 2).

д

Обобщенный

Элемент должен быть числом с плавающей точкой. Он пре­образуется к одному из двух вышеперечисленных видов — выбирается тот, который обеспечивает более короткую запись. Если требуемое число цифр слева от десятичной точки меньше значения поля ширины и само число больше 10" , применяется фиксированный тип. Удаляются все впереди идущие нули, десятичная точка (при возможности), а также символы, разделяющие строку на группы по три цифры.

п m

Числовой Денежный

Совпадает с типом f за исключением того, что после каждой группы из трех цифр ставятся разделительные символы:

d,ddd, ddd.ddd....

Элемент должен быть числом с плавающей точкой, отража­ющей денежную сумму. Способ ее представления зависит от значений глобальных констант, определенных в модуле SYSUTILS (см. ниже). В свою очередь, они зависят от на­стройки Windows на обозначения, принятые в данной стране.

Р

Указатель

Элемент должен быть указателем. На выходе он будет пред­ставлять из себя строку шестнадцатиричных цифр вида

ХХХХ: YYYY, где ХХХХ — селектор, YYYY — смещение.

s

Строка

Элемент может иметь тип string, PChar или быть отдель­ным символом (Char). Эта строка (или символ) вставляются вместо спецификатора формата. Если присутствует поле ргес и длина строки больше его значения, то она усекается.

Примечания:

1. Форматирующие символы можно задавать как в верхнем, так и в нижнем регистрах.

2. Тип преобразования m (денежный) тесно связан с правилами представления, принятыми в конкретной стране. Для этого в модуле SYSUTILS определены значения ряда типизированных констант, начальные значения которых бе­рутся из секции [Inti] файла WIN.INI. Вы можете изменять их значения в соответствии с вашими потребностями:

Имя и тип

Что означает

CurrencyString: string[7];

Символ (или символы), добавляемые к строке с представлением денежной суммы и обозначающие национальную денежную единицу. Это может быть, например, '$', 'DM' или 'руб'.

CurrencyFormat: Byte;

Определяет способ добавления знака денежной единицы к строке. Число 1 будет преобразовано так в зависимости от значения этого параметра: '$!' при 0; '1$' при 1; '$ Г при 2; '1 $' при 3.

NegCurrFormat: Byte;

Определяет способ добавления знака денежной единицы и минуса к строке в том случае, если проис­ходит преобразование отрицательного числа (к поло­жительным числам отношения не имеет). Число -1 будет преобразовано так в зависимости от значения этого параметра: '($!)' при 0; '-$!' при 1; '$-1' при 2; '$!-' при 3; '(!$)' при 4; '-!$' при 5; 'i-$' при 6; '!$-' при 7; '-1 $' при 8; '-$ Г при 9; '$ 1-' при 10.

CurrencyDecimals: Byte;

Число знаков после запятой в представлении денежных сумм. Например, число 10.15 при разных значениях этого параметра отобразится так: '$10' при 0, '$10.15' при 2, '$10.1500' при 4.

ThousandSeparator: Char;

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

DecimalSeparator: Char;

Символ, отделяющий дробную часть числа от целой.

Мы закончили рассмотрение символа типа преобразования. Рассмотрим осталь­ные составные части спецификатора формата.

Поле ширины устанавливает минимально допустимое количество символов в преобразованной строке. Это означает, что если она короче, чем задано в этом поле, то происходит добавление пробелов до требуемого количества. По умолчанию пробелы добавляются спереди (выравнивание по правому краю), но признак выравнивания по левому краю ("-"; он должен стоять перед полем ширины) позволяет выравнивать строку по-иному.

Поле индекса позволяет динамически изменить последовательность извлечения аргументов из массива. Обычно аргументы извлекаются последовательно, по мере их востребования спецификаторами формата. Поле индекса означает, что следующим нужно извлечь аргумент с данным индексом. Пользуясь индексом, одни и те же аргументы могут быть использованы многократно. Например, вызов Format ( ' %s %s %0 : s %s ', [ 'Yes', 'No' ] ) Даст на выходе строку 'Yes No Yes No'.

Поле точности играет разную роль в зависимости от того, с каким типом преобразования применяется. Его особенности приведены вместе с описанием типа (с теми из них, где оно имеет смысл).

Поля индекса, ширины и точности могут быть заданы напрямую или косвенно. Первый способ подразумевает явное указание значения поля (например, ' %10 . 5f '). Для косвенного задания значений нужно в соответствующих местах цифры заменить звездочками (например, '%*.*f'). В этом случае вместо звездочек будут подставлены следующие значения из списка аргументов (они обязательно должны быть целыми числами). Например, выражение

Format('Value is %*.*',[10,5, 2.718]);

эквивалентно:

Format('Value is %10.5',[2.718]);

Как уже упоминалось, наиболее употребимой функцией из группы фор­матирующих является Format, которая работает со строками типа string и максимально освобождает программиста от рутинной работы. Другие функции используют то же ядро и правила преобразования, но отличаются параметрами:

procedure FmtStr(var Result: string; const Format: string; const Args: array of const);

To же, что и Format, но оформлено в виде процедуры. Результат преобразо­вания возвращается в параметре Result.

function StrFmt(Buffer, Format: PChar; const Args: array of const): PChar;

Форматирующая строка должна нахо­диться в параметре Format, а резуль­тирующая помещается в буфер Buffer (он должен иметь нужную длину). Функция возвращает указатель на Buffer.

function StrLFmt(Buffer: PChar; MaxLen: Cardinal; Format: PChar; const Args: array of const) : PChar;

Работает как StrFmt, но длина резуль­тирующей строки не будет превышать MaxLen символов.

function FormatBuf(var Buffer; BufLen: Cardinal; const Format; FmtLen: Cardinal; const Args: array of const) : Cardinal;

Форматирующая строка находится в бу­фере Format длиной FmtLen, a результирующая — в буфере Buffer длиной BufLen. Функция возвращает число реально помещенных в Buffer символов, причем оно всегда меньше или равно BufLen.

Соседние файлы в папке Delphi