Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Вставить операторы для чтения из файла источника и записи в файл приемник






Лабораторная работа №8

Работа с файлами

Задание:

Разработать приложение в среде Delphi, реализующие работу с файлами 4-мя способами: через файловые переменные, с использованием функций Windows API, c использование файловых потоков и с помощью файлов, отображаемых на память. Для всех способов доступа использовать один и тат же файл, одинаковый размер блока данных. Определить время, затрачиваемое программой на обработку файла (результат вывести в поле мемо). Ход обработки файла отобразить с помощью элемента Progress Bar. При нажатии на кнопку старт последовательно выполняются только отмеченные пользователем тесты.

Почему полученные результаты могут меняться? Предложите способ корректного измерения результатов и реализуйте его (подсказка: посмотреть функцию GetThreadTimes).

 

 

Отображение файлов на память:

function TfrmFileTest.CopyByMapping: Integer;

Type

TBuf=array[0..1024-1] of Byte;

PBuf=^TBuf;

Var

i, SrcSize: ULONG;

hSrc, hDst: THandle;

ptrIn, ptrOut: Pointer;

hMapFileIn, hMapFileOut: THandle;

BPI, BPO: PBuf;

Start, Finish: TDateTime;

Begin

if FileExists(DestinationFileName) then DeleteFile(DestinationFileName);

Start: =GetTime;

hSrc: =CreateFile(PAnsiChar(SourceFileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

hDst: =CreateFile(PAnsiChar(DestinationFileName), GENERIC_WRITE or GENERIC_READ, FILE_SHARE_WRITE, nil, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0);

SrcSize: =GetFileSize(hSrc, nil);

prbStatus.Max: =SrcSize div 1024;

hMapFileIn: =CreateFileMapping(hSrc, nil, PAGE_READONLY, 0, 0, nil);

hMapFileOut: =CreateFileMapping(hDst, nil, PAGE_READWRITE, 0, SrcSize, nil);

ptrIn: =MapViewOfFile(hMapFileIn, FILE_MAP_READ, 0, 0, 0);

ptrOut: =MapViewOfFile(hMapFileOut, FILE_MAP_WRITE, 0, 0, SrcSize);

 

BPI: =PBuf(ptrIn);

BPO: =PBuf(ptrOut);

for i: =1 to SrcSize div 1024 do

Begin

BPO^: =BPI^;

Inc(BPO);

inc(BPI);

prbStatus.Position: =i;

Application.ProcessMessages;

end;

 

UnmapViewOfFile(ptrIn);

UnmapViewOfFile(ptrOut);

CloseHandle(hMapFileIn);

CloseHandle(hMapFileOut);

CloseHandle(hSrc);

CloseHandle(hDst);

 

Finish: =GetTime;

CopyByMapping: =MilliSecondsBetween(Start, Finish);

 

prbStatus.Position: =0;

end;

 

Использование Windows API:

function TfrmFileTest.CopyByWindowsAPI: integer;

Var

hSrc, hDst: THandle;

FileSize: ULONG;

Buf: array[0..1024-1]of Byte;

i: Integer;

Start, Finish: TDateTime;

Begin

 

if FileExists(DestinationFileName) then DeleteFile(DestinationFileName);

Start: =GetTime;

hSrc: =CreateFile(PAnsiChar(SourceFileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

hDst: =CreateFile(PAnsiChar(DestinationFileName), GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0);

FileSize: =GetFileSize(hSrc, nil);

prbStatus.Max: =FileSize div 1024;

 

for I: =1 to FileSize div 1024 do

Begin

вставить операторы для чтения из файла источника и записи в файл приемник

prbStatus.Position: =i;

Application.ProcessMessages;

end;

 

CloseHandle(hSrc);

CloseHandle(hDst);

 

Finish: =GetTime;

CopyByWindowsAPI: =MilliSecondsBetween(Start, Finish);

 

prbStatus.Position: =0;

 

end;

 

Использование файловых потоков:

(Реализовать самостоятельно)

 

Использование файловых переменных:

(Реализовать самостоятельно)

 

Генерация тестового файла:

procedure TfrmFileTest.CreateTestFile;

var i, FileLen: integer;

F: TFileStream;

Buf: array[0..1023]of byte;

Begin

FileLen: = StrToInt(txtFileSize.Text);

prbStatus.Max: =FileLen*1024;

F: =TFileStream.Create(SourceFileName, fmCreate);

for i: =1 to FileLen*1024 do

begin

F.Write(Buf, 1024);

prbStatus.Position: =i;

Application.ProcessMessages;

end;

F.Free;

end;

 

Среда Delphi предоставляет возможность выбрать один из четырех вариантов работы c файлами:

· использование традиционного набора функций работы с файлами, унаследованного от Turbo Pascal;

· использование функций ввода/вывода из Windows API;

· использование потоков (TStream и его потомки);

· использование отображаемых файлов.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.