ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 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.