Klopt - die gebruik ik ook, maar die is nogal gelimiteerd - dus heb een paar dingen gedaan om die uit te breiden;
Delphi Code:
type
(* Helper to delete a file from the zipfile - to add the new file after*)
TZipFileHelper = class helper for TZipFile
procedure Delete(FileName: string);
end;
....
(* Bron: [url]https://stackoverflow.com/questions/13164299/delphi-xe2-tzipfile-replace-a-file-in-zip-archive[/url] *)
(******************************************************************************)
procedure TZipFileHelper.Delete(FileName: string);
(******************************************************************************)
var
i, j: Integer;
StartOffset, EndOffset, Size: UInt32;
Header: TZipHeader;
Buf: TBytes;
begin
i := IndexOf(FileName);
if i <> -1 then with Self do begin
// Find extents for existing file in the file stream
StartOffset := FFiles[i].LocalHeaderOffset;
EndOffset := FEndFileData;
for j := 0 to FFiles.Count - 1 do begin
if (FFiles[j].LocalHeaderOffset > StartOffset) and
(FFiles[j].LocalHeaderOffset <= EndOffset) then
EndOffset := FFiles[j].LocalHeaderOffset;
end;
Size := EndOffset - StartOffset;
// Update central directory header data
FFiles.Delete(i);
for j := 0 to FFiles.Count - 1 do begin
Header := FFiles[j];
if Header.LocalHeaderOffset > StartOffset then begin
Header.LocalHeaderOffset := Header.LocalHeaderOffset - Size;
FFiles[j] := Header;
end;
end;
// Remove existing file stream
SetLength(Buf, FEndFileData - EndOffset);
FStream.Position := EndOffset;
if Length(Buf) > 0 then
FStream.Read(Buf[0], Length(Buf));
FStream.Size := StartOffset;
if Length(Buf) > 0 then
FStream.Write(Buf[0], Length(Buf));
FEndFileData := FStream.Position;
end;
end;
Ben er ook achter gekomen dat je met een class helper niet meer aan de private declarations kan komen vanaf D10.1 , maar er is een "bug" - als je een with Self do block gebruikt kan je er wel nog aan.. Zo kan ik in D10.3 deze class helper gebruiken handig weetje!
Met deze helper kan ik de bestanden in de zipfile wel updaten, zonder dat ik een compleet nieuwe zipfile moet schrijven.. Zo doe ik dus een:
Delphi Code:
FModule.Delete('bw_module');
FModule.Add(SS, 'bw_module');
Waarmee ik de "oude" file uit de zip delete, en de nieuwe toevoeg - zo kan ik de standaard Delphi TZipFile class gebruiken voor een eigen bestandsformaat, waar ik scripts, afbeeldingen, css etc in 1 bestand kan bundelen.
Bookmarks