ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 15.01.2021

Просмотров: 188

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Лекция 12

6.6.7. Другие функции для работы с файлами

Модули Delphi предоставляют многочисленный набор процедур и функций для работы с файлами. В этом пункте мы перечислим только наиболее важные из них.

1. Функция FileAge возвращает дату и время создания или изменения файла.

function FileAge(const FileName: string): Integer;

Возвращаемая величина может преобразоваться в величину TDateTime, с помощью функцию FileDateToDateTime. Если файл не существует, то возвращаемое значение равно -1.

2. Функция FileExists проверяет существование файла с именем FileName.

function FileExists(const FileName: string): Boolean;

Функция FileExists возвращает True, если файл с именем FileName существует. Если файл не существует, то возвращается False.

Следующий фрагмент программы проверяет существование файла перед его удалением:

if FileExists(FileName) then

if MsgBox('Вы действительно хотеть удалить ' +

ExtractFileName(FileName)+'?'),[]) = IDYes then

DeleteFile(FileName);

3. Функция FileGetAttr возвращает атрибуты файла с именем FileName.

function FileGetAttr(const FileName: string): Integer;

Возвращенная величина -1 указывает на то, что произошла ошибка.

4. Функция FileSetAttr устанавливает атрибуты файла.

function FileSetAttr(FileName: string; Attr: Integer): Integer;

Возвращаемая величина равна нулю, если функция завершилась удачно. В противном случае возвращаемая величина является номером ошибки.

5. Функция DeleteFile удаляет файл и возвращает False, если удаление невозможно.

function DeleteFile(const FileName: string): Boolean;

6. Функция RenameFile переименовывает файл, имеющий имя OldName.

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

Функция RenameFile пытается изменить имя файла OldFile на NewFile. Если переименование удается, то RenameFile возвращает True. Если не удается переименовать файл (например, если файл с именем NewName уже существует), то функция возвращает False.

7. Функция ChangeFileExt изменяет расширение имени файла.

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

Функция ChangeFileExt берет имя файла FileName и изменяет расширение имени файла на расширение Extension. ChangeFileExt не переименовывает файл, а просто создает новую файловую строку имени.

8. Функция ExtractFilePath возвращает путь как часть имени файла FileName.

function ExtractFilePath(const FileName: string): string;

9. Функция ExtractFileName возвращает имя и расширение имени файла из FileName.

function ExtractFileName(const FileName: string): string;

10. Функция ExtractFileExt возвращает расширение имени файла из FileName.

function ExtractFileExt(const FileName: string): string;

Результирующий строка включает символ точка, который разделяет имя и расширение имени. Результирующая строка пуста, если данный filename не имеет расширения. Например, следующий оператор возвращает расширение имени файла:

MyFilesExtension := ExtractFileExt(MyFileName);

11. Функция ExpandFileName возвращает полный путь к файлу Filename.

function ExpandFileName(const FileName: string): string;

Функция ExpandFileName НЕ проверяет, что имя пути имеет отношение к существующему файлу и существование пути.

12. Функция FileSearch ИЩЕТ определенный DOS путь для файла.

function FileSearch(const Name, DirList: string): string;

13. Функция FileSearch просматривает папки, содержащие в DirList для файла Name. DirList должно быть в том же формате как DOS-путь: имена папок, разделенных точками с запятой. Если FileSearch содержит файл Name, то возвращается строка, содержащая путь для этого файла. Иначе FileSearch возвращает пустую строку.


14. Функция DiskFree ВОЗВРАЩАЕТ количество свободных байтов на диске.

function DiskFree(Drive: Byte): Int64;

Функция DiskFree ВОЗВРАЩАЕТ количество свободных байтов на диске, где 0 = текущий диск, 1 = A, 2 = B, и так далее. DiskFree возвращает -1 если номер проезда недействителен.

15. Функция function DiskSize(Drive: Byte): Int64;

DiskSize возвращает размер логического диска в байтах, где Drive=0 – текущий диск, Drive=1 – A, Drive=2 – B, и т.п.. DiskSize возвращает –1, если номер диска недопустим.

16. Функция FileDateToDateTime преобразовывает величину времени и даты из формата DOS в формат TDateTime.

function FileDateToDateTime(FileDate: Integer): TDateTime;

Программы FileAge, FileGetDate и FileSetDate оперируют временем/датой в формате DOS, и поле Time для структуры TSearchRec, используемые функциями FindFirst и FindNext, содержит время/дату в формате DOS.

17. Функция DateTimeToFileDate преобразовывает величину времени и даты из формата TDateTime в формат DOS.

function DateTimeToFileDate(DateTime: TDateTime): Integer;

6.5.8. Доступ к файлам через дескрипторы

Механизм доступа к файлам с помощью файлового указателя, описанный в предыдущем пункте, не позволяет одновременно работать с одним файлом нескольким приложениям. В Delphi представлен иной файловый механизм, позволяющий устанавливать связь с файлами через дескрипторы. Процедуры и функции, предназначенные для работы с файлами через дескрипторы, собраны в модуле SysUtils.

Табл. 6.9. Процедуры и функции для работы с файлами через дескрипторы


Назначение

Процедуры

1

Указатель

Handle: integer

2

Объявить существующий

FileOpen(FileName:string; Mode:Integer):Integer


Объявить новый

FileCreate(const FileName: string): Integer

3

Чтение

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


Запись

FileWrite(Handle: Integer; Buffer; Count: Integer): Integer

4

Закрыть

FileClose(Handle: Integer)

Другие процедуры и функции


Размер файла

FileSize(f): longint


Переместить указатель

FileSeek(Handle, Offset, Origin: Integer): Integer


Переименовать

Rename(f,newname)


Удалить

Erase(f)



FileGetDate(Handle: Integer): Integer

Функция FileCreate создает новый файл указанного имени FileName:

function FileCreate(const FileName: string): Integer;

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

Более гибко отрывает файл функция FileOpen, которая открывает файл, используя указанный режим доступа. FileOpen отрывает файл, использующий определенный режим доступа. Режима доступа задается с помощью операции ИЛИ одной из констант fmOpenXXXX с одной из констант fmShareXXXX. Если возвращается положительная величина, то файл открыт успешно и возвращенная величина номер открытого файла. Возвращенная величина -1 указывает на то, что произошла ошибка.

function FileOpen(FileName:string; Mode: Integer): Integer;

Параметр Mode может принимать одно из следующих значений:

Таблица 6.10. Значения параметра Mode

Constant


Definition

FmOpenRead

$0000

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

FmOpenWrite

$0001

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

FmOpenReadWrite

$0002

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

FmShareCompat

$0000

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

FmShareExclusive

$0010

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

FmShareDenyWrite

$0020

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

FmShareDenyRead

$0030

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

FmShareDenyNone

$0040

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


Пример 1.

Листинг 6.20. Процедура открытия файла через дескриптор

procedure OpenForShare(const FileName: String);

var

FileHandle : Integer;

begin

FileHandle :=

FileOpen(FileName, fmOpenWrite or fmShareDenyNone);

if FileHandle > 0 then

// допустимый дескриптор

else

// недопустимый дескриптор

end;

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

Mode= fmOpenRead or fmShareDenyNone

А при записи необходимо другим приложениям запрещать запись:

Mode= fmOpenWrite or fmShareDenyWrite.

Функция FileRead читает определенное количество байтов из файла.

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

Функция FileRead читает Count байтов из Handle в буфер. Функция возвращает фактически прочитанное число байтов, которое может быть меньше чем Count. Файл, на который указывает параметр Handle, должен быть открыт с помощью процедур FileOpen или FileCreate.

Следующий оператор заполняет буфер из файла:

ActualRead := FileRead(Handle, Buffer, SizeOf(Buffer)).

Пример 2. Чтение файла

Листинг 6.21. Процедура чтения файла через дескриптор

var

Handle, NumRead, Size: integer;

buffer: array[0..511] of TRec;

begin

Size:=SizeOf(TRec);

Handle:=FileOpen('F.dat',fmOpenRead or fmShareDenyNone);

repeat

NumRead:=FileRead(Handle,buffer,Size);

for j:=0 to (NumRead div Size)-1 do

begin

...

end;

until NumRead=0;

FileClose(Handle);

end;

Метод FileWrite предназначен для записи в файлы.

function FileWrite(Handle: Integer; Buffer; Count: Integer): Integer;

Функция FileWrite пишет Count байтов в файл определенный Handle из буфера, определенного переменой Buffer. Возвращаемая величина является количеством байтов действительно записанных или –1, если произойдет ошибка.

Функция FileSeek перемещает текущий файловый указатель в пределах открытого файла.

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

function FileSeek(Handle: Integer; const Offset: Int64;

Origin: Integer): Int64;

Указатель Handle, используемый FileSeek, должен быть открыт методами FileOpen или FileCreate.

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

Origin является параметром с тремя возможными значениями, обозначающим начало файла, конец файла, и текущую позицию файлового указателя.

Таблица 6.11. Значения параметра Mode

Origin

Action

0

Файловый указатель смещается на Offset байтов от начала файла.

1

Файловый указатель смещается на Offset байтов из текущей позиции.

2

Файловый указатель смещается на Offset байтов от конца файла.

Если работа функции FileSeek завершается успешно, то она возвращает новую позицию файлового указателя; в противном случае возвращает -1.

Следующий пример перемещает файловый указатель в конец файла:

if FileSeek(MyFileHandle,0,2) = HFILE_ERROR then

HandleFileError

else

AppendStuff;

Процедура FileClose закрывает файл.

procedure FileClose(Handle: Integer);

Функция FileGetDate возвращает дату и время в формате DOS последнего изменения файла.


function FileGetDate(Handle: Integer): Integer;

Возвращаемая величина равна –1, если указатель Handle не определен. Для преобразования возвращаемой величины в значение типа TDateTime можно использовать функцию FileDateToDateTime.