Thema: Delphi Datei Archiv

Einzelnen Beitrag anzeigen

Zerolith

Registriert seit: 12. Mär 2003
Ort: Kempten
188 Beiträge
 
Delphi 6 Enterprise
 
#1

Datei Archiv

  Alt 8. Dez 2003, 09:29
Hallo!

jeder kennt es - vorallem von spielen. Diese übergroßen Ressourcen Dateien in denen alles drin ist
naja, ich möchte au so was probieren. Hab auch schon meine Anfänge. Aber komm leider nicht weiter. Hier ist meine
Klasse mit der ich das Realisieren möchte. Aber es Funktioniert leider nicht so.

Ich hab auch keine Ahnung wie ich folgende Sachen realisieren soll.
+ Unterordner
+ Datei Suchen

Wie ihr seht hab ich es noch nichtmal geschafft die wirkliche Datei ins Archiv zu bekommen.
Bitte, helft mir!

(ich weiß nicht mal ob ich im richtigen Forum bin - eigtl. gehört das ja eher unter Datenbank aber das kann man ja sehen wie man will =) )

Danke, Daniel

Delphi-Quellcode:
...
Const BufferSize = 32;

type TArchivFile = Record
  FileName : String[100];
  FileSize : integer;
  FileContent : File;
  Inserted : TDateTime;
  Modified : TDateTime;
  Status : smallint;
  Visible : Boolean;
end;

type TZPAKArchiv = class
 private
   TArchiv : File of TArchivFile;
    function GetCount: Integer;
 public
   Constructor Create;
   procedure OpenArchiv(filename : String);
   procedure CloseArchiv;
   procedure DeleteFile(Position : LongWord);
   function ReadFile(Position : LongWord) : TArchivFile;
   procedure AddFile(ArchivFile : TArchivFile);
   procedure ModFile(ArchivFile : TArchivFile; Position : LongWord);
   property Count : Integer Read GetCount;
end;

implementation

{ TZPAKArchiv }

constructor TZPAKArchiv.Create;
begin
  inherited;
end;

procedure TZPAKArchiv.CloseArchiv;
begin
 CloseFile(TArchiv);
end;

procedure TZPAKArchiv.OpenArchiv(filename : String);
begin
  AssignFile(TArchiv, filename);
  if FileExists(filename) then ReSet(TArchiv) else ReWrite(TArchiv);
end;

function TZPAKArchiv.ReadFile(Position: LongWord): TArchivFile;
begin
  if (Position < 0) or (Position >= FileSize(TArchiv)) then Exit
  else
  begin
    Seek(TArchiv, Position);
    read(TArchiv, Result);
  end;
end;

procedure TZPAKArchiv.DeleteFile(Position: LongWord);
var Buffer : array[0..BufferSize - 1] of TArchivFile;
    i, p : Integer;
    StartRecord, EndRecord : Integer;
    Max : Integer;
begin
  Seek(TArchiv, Position-1);
  StartRecord := Position+1;
  EndRecord := Position;
  While StartRecord < EndRecord do
  begin
    Max := BufferSize;
    if Max > EndRecord - StartRecord then
      Max := EndRecord - StartRecord;
    Seek(TArchiv, StartRecord);
    for i := 0 to Max -1 do
      Read(TArchiv, Buffer[i]);
    Seek(TArchiv, StartRecord-1);
    for i := 0 to Max - 1 do
      Write(TArchiv, Buffer[i]);
    inc(StartRecord);
  end;
  Truncate(TArchiv);
end;

procedure TZPAKArchiv.AddFile(ArchivFile: TArchivFile);
var Buffer : Array[0..BufferSize - 1] of TArchivFile;
    i, p : integer;
begin
  Seek(TArchiv,0);
  p := 0;
  while not eof(TArchiv) do
  begin
   Read(TArchiv, Buffer[p]);
   inc(p);
  end;
  closeFile(TArchiv);
  Buffer[p+1].FileName := ArchivFile.FileName;
  Buffer[p+1].FileSize := ArchivFile.FileSize;
// Buffer[p+1].FileContent := ArchivFile.FileContent;
  Buffer[p+1].Inserted := ArchivFile.Inserted;
  Buffer[p+1].Modified := ArchivFile.Modified;
  Buffer[p+1].Status := ArchivFile.Status;
  Buffer[p+1].Visible := ArchivFile.Visible;
  ReWrite(TArchiv);
  for i := 0 to p do Write(TArchiv, Buffer[i]);
end;

procedure TZPAKArchiv.ModFile(ArchivFile: TArchivFile; Position: LongWord);
var Datensatz : TARchivFile;
begin
  Seek(TArchiv, Position-1);
  Datensatz.FileName := ARchivFile.FileName;
  Datensatz.FileSize := ArchivFile.FileSize;
// Datensatz.FileContent := ArchivFile.FileContent;
  Datensatz.Inserted := Archivfile.Inserted;
  Datensatz.Modified := Archivfile.Modified;
  Datensatz.Status := ArchivFile.Status;
  Datensatz.Visible := ArchivFile.Visible;
  write(TArchiv, Datensatz);
end;

function TZPAKArchiv.GetCount: Integer;
begin
  Result := FileSize(TArchiv)-1;
end;
...
Daniel
  Mit Zitat antworten Zitat