Delphi.Заметки программиста
f65d50f6

Создание файла методом его отображения


unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, Spin;
type
TForm1 = class(TForm) btMem: TButton; btFile: TButton; se: TSpinEdit; Label1: TLabel; pb: TProgressBar; Label2: TLabel; lbMem: TLabel; lbFile: TLabel; procedure btMemClick(Sender: TObject);
procedure btFileClick(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.btMemClick(Sender: TObject);
// Создание файла методом его отображения type
PReal = ^Real; var
HFile, HMap: THandle; AdrBase, AdrReal: PReal; k: Integer; FSize: Cardinal; BegTime: TDateTime; begin


BegTime := Time; // Засекаем время пуска // Готовим ProgressBar: pb.Max := se.Value; pb.Position := 0; pb.Show; FSize := se.Value * SizeOf(Real);
// Длина файла HFile := FileCreate('test.dat');
// Создаем файл if HFile = 0 then // Ошибка: возбуждаем исключение raise Exception.Create('Ошибка создания файла');
try
// Отображаем файл в память HMap := CreateFileMapping( HFile, NIL, PAGE_READWRITE, 0, FSize, NIL);
if HMap = 0 then // Ошибка: возбуждаем исключение raise Exception.Create('Ошибка отображения файла');
try
// Создаем окно просмотра: AdrBase := MapViewOfFile(HMap, FILE_MAP_WRITE, 0, 0, FSize);
if AdrBase = NIL then // Ошибка: возбуждаем исключение raise Exception.Create('Невозможно просмотреть файл');
// Сохраняем начальный адрес для правильной ликвидации // окна просмотра: AdrReal := AdrBase; for k := 1 to se.Value do
begin
AdrReal^ := Random; // Помещаем в файл новое число // Перед наращиванием текущего адреса необходимо // привести его к типу Integer или Cardinal: AdrReal := Pointer(Integer(AdrReal) + SizeOf(Real));
lbMem.Caption := IntToStr(k);
pb.Position := k; Application.ProcessMessages; end;
// Освобождаем окно просмотра: UnmapViewOfFile(AdrBase) finally
// Освобождаем отображение CloseHandle(HMap) end
finally
// Закрываем файл end;
// Сообщаем время счета pb.Hide; lbMem.Caption := TimeToStr(Time-BegTime) end;
procedure TForm1.btFileClick(Sender: TObject);
// Создание файла обычным методом var
F: File of Real; k: Integer; BegTime: TDateTime; R: Real; // Буферная переменная для обращения к Write begin
BegTime := Time; // Засекаем начальное время счета // Готовим ProgressBar: pb.Max := se.Value; pb.Position := 0; pb.Show; // Создаем файл: AssignFile(F, 'test.dat');
Rewrite(F);
for k := 1 to se.Value do
begin
R := Random; // Параметрами обращения к Write Write(F, R);
// могут быть только переменные lbFile.Caption := IntToStr(k);
pb.Position := k; Application.ProcessMessages; end;
CloseFile(F);
pb.Hide; lbFile.Caption := TimeToStr(Time-BegTime) end;
end.

Содержание раздела