| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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; работает только на чтение |
| Автор: serious 4.4.2003, 18:11 |
| А как, допустим, прочитать файл как файл байт, ну т.е. первый, второй и т.д. байты вот таким макаром? |
| Автор: man2002ua 5.4.2003, 09:13 | ||||
То же самое , что и с указателем, на mallocированную память
Так же, как и при работе с mallocированной памятью, тебе же написали пример: i := PInteger(DataPtr)^; для байтов - PByte |