DruckenMister WongFacebook

myArchiv

von Johannes Tränkle

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, f
2: 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(f
2,1);
  Size:=FileSize(f
2); // 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(f
2, zwi, 40000, gelesen);
    BlockWrite(f, zwi, gelesen);
  end;

  CloseFile(f
2);
  CloseFile(f);
end;