Программа на Delphi
cedure BlockRead( f: File; Var Buf; Count: Word[; Var Result:
Word]);
Читает из файла Count записей в переменную Buf. Result – реально
прочитанное количество записей.
5. Procedure BlockWrite( f: File; Var Buf; Count: Word[; Var Result:
Word]);
Пишет в файл первых Count записей из переменной Buf. Result – реально
записанное количество записей.
6. Procedure Seek( f: File; N: LongInt);
Перемещает указатель на запись с номером N. Первая запись имеет
порядковый номер 0.
7. Function FilePos( f: File): LongInt;
Возвращает номер записи, на которую установлен указатель.
8. Procedure CloseFile( f: File);
Закрывает файл.
9. Function Eof(f: File): boolean;
Возвращает True, если достигнут конец файла.
10. Function FileSize(f: File): LongInt;
Возвращает количество записей в файле. Например, Seek(f, FileSize(f))
установит указатель в конец файла (после последней записи).
11. Procedure Truncate(f: File of Type);
Уничтожает (отрубает) конец файла начиная с записи, на которую
установлен указатель.
Язык Object Pascal не накладывает никаких ограничений на длину записи
(теоретически она может иметь размер до 2 Гб).
Пример описания и обращения к функции ReadFromFile, читающей из файла nF в
позиции Pos запись r размером Sz.
function ReadFromFile(nF: String; Pos: Word; Var r; Sz: Word): boolean;
Var
g: File;
Recs, ReadReal: Integer;
RecRead: boolean;
Begin
Assign(g, nF);
Recs:= FileSize(g) div Sz; {количество записей в файле}
RecRead:= (Pos < Recs); {запись с номером Pos есть ?}
if RecRead then begin {если запись есть}
Reset(g, Sz); {открыть файл}
try
Seek(g, Pos); {установить указатель на запись}
BlockRead(g, r, 1, ReadReal); {прочитать запись}
RecRead:= (ReadReal = 1); {прочитано успешно ?}
finally
Close(g); {закрыть файл}
end;
end;
Result:= RecRead;
end {ReadFromFile};
…
Type
tStud = Record
Fio: String [60];
Curs: byte;
Stipendiya, Room: boolean;
End;
Var Stud: tStud;
…
if ReadFromFile('base2.ff1', 12, Stud, SizeOf(Stud))
then Writeln('Запись из 12-й позиции прочитана');
Приведем еще пример. В директории 'c:BasesSdudBase' находится файл
'AllStuds.bs', в котором хранятся данные о студентах в виде записей типа
Type
TStud = Record {студент}
Fio: String[50]; {'Фамилия Имя Отчество'}
Born: byte; {Год рождения, например, 1979}
Faculty: String[4]; {Факультет, например, 'МТФ'}
Group: String[8]; {Группа, например, 'МТ 17-2'}
End;
Ниже приведена универсальная процедура, которая копирует из этого файла в
другой файл данные только о тех студентах, которые имеют заданный год
рождения:
Procedure StudsCopy(nF1, nF2: ShortString; BornYear: byte;
Var Count: Word; Var: Ind: ShortInt);
{nF1 – файл-источник, nF2 – файл-приёмник,
BornYear – требуемый год рождения,
Count – скопировано записей,
Ind – индикатор контроля:
0 – нормально, 1 – было неверное чтение, была неверная запись}
Var
g: tStud;
K, Sz, i,j: Word;
f1, f2: File;
Begin
Count:= 0; {инициализация счетчика}
Ind:=0; {изначально предполагаем нормальный процесс, иначе Ind изменим}
Sz:= SizeOf(g); {размер одной записи}
K:= KdnFileSize(nF1, Sz); {количество записей в файле-источнике}
If (K > 0) then {если в файле-источнике есть записи }
Begin
Assign(f1, nF1); {файл-источник связываем переменной f1}
Reset(f,Sz); {открываем файл-источник с записями размера Sz}
Assign(f2, nF2); {файл-приёмник связываем переменной f2 }
Rewrite(f2,Sz); {создаем новый файл-приёмник под записи размера Sz}
try
For j:=1 to K do
Begin
BlockRead(f1, g, 1, i); {чтение записи}
Case i of
1: {запись прочитана}
if (g.Born = BornYear) then { студент имеет требуемый год рождения}
begin
BlockWrite(f2, g, 1, i); {запись в файл-приёмник}
If (i > 0) then Inc(Count) {если записано правильно}
else
begin Ind:= 1; Break; End; {записано неверно, сразу выход из цикла}
end; {if}
0: begin Ind:= -1; Break; end; {запись не прочитана, сразу выход из цикла}
end; {Case}
end; {цикла For}
finally
CloseFile(f1); {закрываем файл-источник}
CloseFile(f2); {закрываем файл-приёмник}
end; {блока try – finally – end}
End {If };
End {StudsCopy};
Операторы, реализующие копирование требуемых данных в файл '1979.bs':
StudsCopy ('AllStuds.bs', '1979.bs', 1979, Count1979, Ind1979);
Case Ind1979 of
-1: Writeln('Зафиксирована ошибка чтения');
1: Writeln('Зафиксирована ошибка записи');
0: Writeln('Процесс прошел нормально');
end; {Case}
Writeln('Скопировано записей: ' + IntToStr(Count1979));
В этом примере использована внешняя процедура KdnFileSize {количество
записей в файле }. Приведем ее текст:
function KdnFileSize(nF: ShortString, Siz: Word): LongInt;
{nF – имя файла, Siz – размер одной записи }
Var
F: File;
L: LongInt;
Begin
L:=0;
If FileExists(nF) then
begin
Assign(f, nF);
Reset(f,1);
L:= SizeOf(f);
If not (L mod Siz = 0) then Writeln('Файл ' + nF + имеет другой тип');
L:= L div Siz;
CloseFile(f);
End;
Result:= L;
End;
17.5. Процедуры и функции для работы с файлами
Эти подпрограммы предназначены для работы с файлами, папками (директориями)
и дисками.
1. Procedure ChDir(Dir: String);
Делает папку Dir текущей. Пример: ChDir('c:');
2. Procedure GetDir(D: Byte; Var Dir: String);
Возвращает текущую папку на заданном устройстве. (D= 0 – текущий диск,
1 – диск А, 2 – диск B и т.д.). Пример: GetDir(0, s);
3. Procedure RmDir(Dir: String);
Уничтожает заданную папку. Папка не должна содержать вложенных папок
или файлов. Пример: RmDir('Folder66');
4. Procedure Erase(f);
Удаляет файл, связанный с файловой переменной f. Файл должен быть
закрыт.
5. Procedure Rename(f, FileName: String);
Переименовывает файл, связанный с файловой переменной f. Файл должен
быть закрыт. Пример: Rename(g, 'studs.txt');
6. Function DiskFree(D: byte): LongInt;
Возвращает количество свободной памяти в байтах на устройстве D. Код
драйвера задается так же, как в процедуре GetDir. Если код указан
неверно, то возвращает -1.
7. Function DiskSize(D: byte): LongInt;
Возвращает количество свободной памяти в байтах на устройстве D. Код
драйвера задается так же, как в процедуре GetDir. Если код указан
неверно, то возвращает -1.
8. Function FindFirst(const Path: string; Attr: Integer;
var F: TSearchRec): Integer;
Находит имя первого файла с заданными атрибутами Attr в папке Path.
Результат поиска выводит в переменную F. Если поиск успешен, то
функция вернет 0, иначе вернет код ошибки Widows. К FindFirst можно
обращаться не только как к функции, но и как к процедуре.
Атрибуты файла приведены в табл. 17.
Таблица 17
|Атрибут |Описание файлов |
|faReadOnly |Файлы "Только для чтения" |
|faHidden |Скрытые файлы |
|faSysFile |Системные файлы |
|faVolumeID |Файл ID-значений |
|faDirectory |Папки (директории) |
|faArchive |Архивы (файлы) |
|faAnyFile |Все файлы |
Тип, характеризующий найденный файл, представляет запись вида :
type
TSearchRec = Record
Time: Integer; {время}
Size: Integer; {размер файла в байтах}
Attr: Integer; {атрибуты файла}
Name: TFileName; {DOS-путь файла}
ExcludeAttr: Integer;
FindHandle: THandle;
FindData: TWin32FindData; {дополнительная информация о файле}
end;
Пример:
Var
SR: TSearchRec;
S: String;
…
FindFirst('c:Program Filesdelphi4bin*.*', faAnyFile, SR);
if (SR.Attr = faArchive) then
S:= 'Файл ' + SR.Name + ' имеет размер ' + IntToStr(SR.Size) + '
байт';
В данном примере процедура FindFirst ищет первый файл по маске '*.*'
(все файлы) в папке 'c:Program Filesdelphi4bin'. Атрибут faAnyFile
означает, что поиск производится по всем видам файлов, под которыми
понимаются папки (директории), '.', '..' – ссылки на текущую и
родительскую папку, внутренние папки и собственно файлы. Последние в
терминологии файловой атрибутики называются архивами. Далее, если
найденный файл есть архив, т е. файл в общепринятой терминологии, то в
строку S будет помещено сообщение. Например, если найденный файл имеет
имя Ig.ttg и его размер равен 15899, то S= 'Файл Ig.ttg имеет размер
15889 байтов'.
1. Function FindNext(var F: TSearchRec): Integer;
Находит следующий файл, атрибуты которого указаны в FindFirst.
2. Procedure FindClose(var F: TSearchRec);
Закрывает действие FindFirst/FindNext.
3. Function DeleteFile(const FileName: string): Boolean;
Удаляет файл по имени. Если файл не может быть удален или не
существует – возвращает False.
4. Function CreateDir(const Dir: string): Boolean;
Создает новую папку.
5. Function GetCurrentDir: string;
Возвращает текущую папку.
6. Function GetCurrentDir: string;
Возвращает текущую папку.
7. Function SetCurrentDir(
| | скачать работу |
Программа на Delphi |