Hi,
ich habe hier ein Problem mit einer 200mb großen Datei die ich für eine App unter iOS laden will. Im Debugmodus klappt das ganze problemlos, aber im Anwendungs-Store-Modes stimmt die Dateigröße nicht und da ich meine Indexinformationen am Dateiende habe sind die Indexdaten natürlich Schrott.
Die Klasse schaut so aus:
Delphi-Quellcode:
unit UMyDB;
interface
uses System.Classes, System.SysUtils;
type
TIndex =
packed record
Offset: Int64;
len: Cardinal;
flags: Cardinal;
end;
TMyDB =
class
private
FStream: TFileStream;
FIndex:
Array of TIndex;
function GetCount: Cardinal;
public
constructor Create(
const Filename:
String);
destructor Destroy;
override;
function Read(
index: integer; Stream: TMemorystream): Boolean;
property Count: Cardinal
read GetCount;
end;
implementation
constructor TMyDB.Create(
const Filename:
String);
var
len: Cardinal;
sz: Int64;
begin
SetLength(FIndex, 0);
if FileExists(Filename)
then
begin
FStream := TFileStream.Create(Filename, fmOpenRead);
FStream.Position := FStream.Size - 4;
FStream.
Read(len, 4);
SetLength(FIndex, len);
sz := sizeof(TIndex) * len;
FStream.Position := FStream.Size - 4 - sz;
FStream.
Read(FIndex[0], sz);
end;
end;
destructor TMyDB.Destroy;
begin
FreeAndNil(FStream);
SetLength(FIndex, 0);
inherited;
end;
function TMyDB.GetCount: Cardinal;
begin
result := Length(FIndex);
end;
function TMyDB.
Read(
index: integer; Stream: TMemorystream): Boolean;
begin
result := (
index >= 0)
and (
index <= high(FIndex));
if result
and assigned(Stream)
then
begin
Stream.SetSize(FIndex[
index].len);
FStream.Position := FIndex[
index].Offset;
FStream.
Read(Stream.Memory^, Stream.Size);
FStream.Seek(0, 0);
end;
end;
end.