Hallo Leute,
im folgen habe ich ein kleines Codestück angehangen, wo beispielhaft zwei Dateien in ein Archiv gepackt werden sollen. Als Basis hierzu nutze ich
"ZLib 1.1.4". Nun, die Dateien werden wie ich das gesehen habe normal gepackt, jedoch nicht richtig zusammengefügt. Ich denke, im mit "//->" markierten Bereich liegt der Fehler versteckt. Aber ich steh auf dem Schlauch!
Delphi-Quellcode:
procedure ZLibPacken();
var
DateiListe : TStrings;
DateiCounter : Integer;
Counter : Integer;
QuellDatei : TFileStream;
QuellDateiName : String;
QuellDateiSize : Integer;
TempDatei : TFileStream;
KompDatei : TZCompressionStream;
ZielDatei : TFileStream;
begin
DateiListe := TStringList.Create;
try
DateiListe.Add(ExtractFilePath(Application.ExeName)+'a\a.exe');
DateiListe.Add(ExtractFilePath(Application.ExeName)+'a\b.exe');
DateiCounter := DateiListe.Count;
ZielDatei := TFileStream.Create(ExtractFilePath(Application.ExeName)+'ziel.dat', fmCreate);
ZielDatei.Write(DateiCounter,SizeOf(DateiCounter));
for Counter := 0 to DateiCounter-1 do
begin
QuellDatei := TFileStream.Create(DateiListe[Counter],fmOpenRead);
try
// der originale Dateiname
QuellDateiName := ExtractFilename(DateiListe[Counter]);
QuellDateiSize := Length(QuellDateiName);
ZielDatei.Write(QuellDateiSize,SizeOf(QuellDateiSize));
ZielDatei.Write(QuellDateiName[1],QuellDateiSize);
// die originale Dateigröße
QuellDateiSize := QuellDatei.Size;
ZielDatei.Write(QuellDateiSize,SizeOf(QuellDateiSize));
// die originale Datei komprimieren und temporär Speichern
TempDatei := TFileStream.Create(ExtractFilePath(Application.ExeName)+'a\ziel.tmp', fmCreate);
KompDatei := TZCompressionStream.Create(TempDatei,zcNone); // zcNone, zcFastest, zcDefault, zcMax
try
KompDatei.CopyFrom(QuellDatei,QuellDateiSize);
finally
KompDatei.Free;
TempDatei.Free;
end;
//-> // die komprimierte Datei an die Zieldatei anhängen
TempDatei := TFileStream.Create(ExtractFilePath(Application.ExeName)+'a\ziel.tmp', fmOpenRead);
try
ZielDatei.CopyFrom(TempDatei,0);
finally
TempDatei.Free;
end;
finally
QuellDatei.Free;
end;
end;
finally
ZielDatei.Free;
DateiListe.Free;
DeleteFile(ExtractFilePath(Application.ExeName)+'ziel.tmp');
end;
end;
Zudem eine ergänzende Frage, wenn der Code oben denn mal funktioniert. Gibt es eine Möglichkeit den Inhalt eines Verzeichnis - sprich alle Dateien (ggf. + Unterverzeichnisse) in die TStringList aufzunehmen?
Viele Grüße,
PP