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;