Home » Tutorials » Datenspeicherung » myArchiv

myArchiv

Neues Archiv erstellen

Wie ich in der Einleitung schon schrieb, habe ich mich für das Format „Name“-„Größe der Datei“-„Daten“ entschieden.
Für jede Archivdatei definieren wir daher folgenden Typ:

type ArchivTyp = record
      ArchivFile:File;
      FileStart:TStringList;
      FileNames:TStringList;
    end;

Um eine Datei an ein Archiv anzuhängen oder um ein neues Archiv zu erstellen, benutzen wir folgenden Code:

procedure WriteArchivFile(ArchivName, FileName, NameImArchiv: String);
var f, f2: File;
  I, q: Integer;
  Size: LongInt;
  // der Speicher sollte eigentlich dynamisch
  // belegt werden, aber was soll's
  zwi: Array[1..40000] of byte;

  gelesen: integer;
  SSize: byte; // Länge des Strings
begin
  if FileExists(ArchivName) then  // wenn schon ein Archiv besteht,
  begin                          // wird dieses geöffnet
    AssignFile(f,ArchivName);
    ReSet(f,1);
    Seek(f,FileSize(f));
  end
  else begin // andernfalls erstellen wir einfach ein neues
    AssignFile(f,ArchivName);
    ReWrite(f,1);
  end;
  sSize:=Length(NameImArchiv);
  { Um flexibel zu bleiben, wird im Archiv nicht der ursprüngliche
    Dateiname der übergebenen Datei gespeichert, sondern ein separat
    übergebener "NameImArchiv". So können z.B. relative Angaben
    verwirklicht werden "irgendwas/unserer.datei".
    Im Archiv können auch mehrere Datein mit dem gleichen Namen vorkommen,
    es erfolgt keine Überprüfung. Wer das nicht möchte, muss den
    Code abändern.
  }

  // wie groß ist der Name
  BlockWrite(f,SSize,SizeOf(SSize));
  // wir schreiben den gewünschten Namen
  BlockWrite(f,NameImArchiv[1],SSize);

  { anzuhängende Datei }
  AssignFile(f2,FileName);
  Reset(f2,1);
  Size:=FileSize(f2); // die Größe von FileName

  BlockWrite(f,Size,SizeOf(Size)); // es wird die Größe in das Archiv
                                   // geschrieben
  { jetzt Daten }
  while not EOF(f2) do
  begin
    BlockRead(f2, zwi, 40000, gelesen);
    BlockWrite(f, zwi, gelesen);
  end;

  CloseFile(f2);
  CloseFile(f);
end;