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;