Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > FileMapping


Автор: serious 4.4.2003, 16:02
Вот такой вопрос: как работать с файлами, отображенными в память? Особенно не понятно, что делать с указателем на начало области отображения файла.

Автор: Song 4.4.2003, 16:39
Какой именно параметр тебе не понятен?

Автор: stab 4.4.2003, 17:17
Цитата
Особенно не понятно, что делать с указателем на начало области отображения файла.


работатть как с обычным указателем на данные, т.е. у тя есть указатель на отображенные данные и известно что в файле хранится Integer, тогда:

i := PInteger(DataPtr)^;

если массив Integer из 100 элементов то:

for i := 1 to 100 do begin
ShowMessage(IntToStr(PInteger(DataPtr)^));
Inc(PInteger(DataPtr));
end;

проще же сразу наложить структуру на память, т.е.:

TSomeRecord = record
Name: array[1..8] of Char;
Age: Byte;
end;

PSomeRecord = ^TSomeRecord;

var
r: PSomeRecord;

r := PSomeRecord(DataPtr);
ShowMessage(r.Name);

Самое же прикольное что у мя вышло это:

TMemoryMappedStringList = class(TStringList)
private
FFileHandle: Cardinal;
FFileMappingHandle: Cardinal;
FMappedData: PChar;
public
destructor Destroy; override;
procedure MapFromFile(FileName: String);
end;


destructor TMemoryMappedStringList.Destroy;
begin
if FFileHandle <> 0 then begin
UnmapViewOfFile(FMappedData);
CloseHandle(FFileMappingHandle);
CloseHandle(FFileHandle);
end;
inherited;
end;


procedure TMemoryMappedStringList.MapFromFile(FileName: String);
begin
FFileHandle := CreateFile(PChar(FileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if FFileHandle <> 0 then
FFileMappingHandle := CreateFileMapping(FFileHandle, nil, PAGE_READONLY, 0, 0, nil);
if FFileMappingHandle <> 0 then
FMappedData := MapViewOfFile(FFileMappingHandle, FILE_MAP_READ, 0, 0, 0);
if FMappedData <> nil then
SetText(FMappedData);
end;

работает только на чтение smile.gif

Автор: serious 4.4.2003, 18:11
А как, допустим, прочитать файл как файл байт, ну т.е. первый, второй и т.д. байты вот таким макаром?

Автор: man2002ua 5.4.2003, 09:13
Цитата
Особенно не понятно, что делать с указателем на начало области отображения файла

То же самое , что и с указателем, на mallocированную память smile.gif

Цитата
А как, допустим, прочитать файл как файл байт, ну т.е. первый, второй и т.д. байты вот таким макаром

Так же, как и при работе с mallocированной памятью, тебе же написали пример:
i := PInteger(DataPtr)^;
для байтов - PByte

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)