Results 1 to 5 of 5

Thread: Tekst bestand uitlezen vanuit zipfile

  1. #1

    Tekst bestand uitlezen vanuit zipfile

    Ik wil een eigen formaat maken voor een bestand - en omdat deze nogal uitgebreid is dacht ik ik los het op door het in een pakket te steken. Dat wilt zeggen dat ik een zipfile maak met daarin een aantal tekstbestanden (json) en aantal scripts (javascript) -

    Nu zou ik deze willen laden in de ZipFile en de inhoud van de json bestanden uitlezen zonder deze eerst in een locatie te exporteren. Nu probeer ik dat door deze te extracten naar een memorystream;
    Delphi Code:
    1. FModule.Read('module_.json', LStream, LHeader);

    Maar ik krijg de melding: EZDecompressonerror invalid zstream operation

    Iemand die dit begrijpt - of een werkend voorbeeld kan geven, want ik loop wat vast

  2. #2
    Senior Member Wok's Avatar
    Join Date
    Dec 2002
    Location
    Alkmaar
    Posts
    2,085
    Probeer deze eens, ik heb ooit soortgelijke problemen gehad.

    Delphi Code:
    1. var
    2.   fWorkStream: TMemoryStream;
    3.   fStreamDeCompressor: TDeCompressionStream;
    4.   fBufLen: integer;
    5.   fBuffer: array[0..16383] of byte;
    6. begin
    7.   fWorkStream := TMemoryStream.create;
    8.   fInputStream.position := 0;
    9.   fStreamDeCompressor := TDeCompressionStream.create(fInputStream);
    10.   try
    11.     fBufLen := fStreamDeCompressor.Read(fBuffer, SizeOf(fBuffer));
    12.     while fBufLen > 0 do
    13.     begin
    14.       fWorkStream.Write(fBuffer, fBufLen);
    15.       fBufLen := fStreamDeCompressor.Read(fBuffer, SizeOf(fBuffer));
    16.     end;
    17.   finally
    18.     FreeAndNil(fStreamDeCompressor);
    19.   end;
    20.   fWorkStream.position := 0;
    10.4.2, Delphi2010, of Lazarus 2.2.0

  3. #3
    Top Dankjewel! Ik was al "bang" dat ik naar zipforge moest overschakelen - probeer zoveel mogelijk stock componenten te gebruiken, en zeker voor zoiets "simpels"
    Ik ga hier eens mee aan de slag - als er mensen zijn die een beter manier weten om een bestandsformaat te maken waar ik alles in kan zetten, hoor ik het ook graag. Heb mij vooral laten inspireren door xlsx formaat wat ook een zip formaat is

  4. #4
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Vziw zit er vanaf D2010 standaard een tzipfile in Delphi?

  5. #5
    Klopt - die gebruik ik ook, maar die is nogal gelimiteerd - dus heb een paar dingen gedaan om die uit te breiden;
    Delphi Code:
    1. type
    2.   (* Helper to delete a file from the zipfile - to add the new file after*)
    3.   TZipFileHelper = class helper for TZipFile
    4.     procedure Delete(FileName: string);
    5.   end;
    6.  
    7. ....
    8.  
    9. (* Bron: [url]https://stackoverflow.com/questions/13164299/delphi-xe2-tzipfile-replace-a-file-in-zip-archive[/url] *)
    10. (******************************************************************************)
    11. procedure TZipFileHelper.Delete(FileName: string);
    12. (******************************************************************************)
    13. var
    14.   i, j: Integer;
    15.   StartOffset, EndOffset, Size: UInt32;
    16.   Header: TZipHeader;
    17.   Buf: TBytes;
    18. begin
    19.   i := IndexOf(FileName);
    20.   if i <> -1 then with Self do begin
    21.     // Find extents for existing file in the file stream
    22.     StartOffset := FFiles[i].LocalHeaderOffset;
    23.     EndOffset := FEndFileData;
    24.     for j := 0 to FFiles.Count - 1 do begin
    25.       if (FFiles[j].LocalHeaderOffset > StartOffset) and
    26.          (FFiles[j].LocalHeaderOffset <= EndOffset) then
    27.         EndOffset := FFiles[j].LocalHeaderOffset;
    28.     end;
    29.     Size := EndOffset - StartOffset;
    30.     // Update central directory header data
    31.     FFiles.Delete(i);
    32.     for j := 0 to FFiles.Count - 1 do begin
    33.       Header := FFiles[j];
    34.       if Header.LocalHeaderOffset > StartOffset then begin
    35.         Header.LocalHeaderOffset := Header.LocalHeaderOffset - Size;
    36.         FFiles[j] := Header;
    37.       end;
    38.     end;
    39.     // Remove existing file stream
    40.     SetLength(Buf, FEndFileData - EndOffset);
    41.     FStream.Position := EndOffset;
    42.     if Length(Buf) > 0 then
    43.       FStream.Read(Buf[0], Length(Buf));
    44.     FStream.Size := StartOffset;
    45.     if Length(Buf) > 0 then
    46.       FStream.Write(Buf[0], Length(Buf));
    47.     FEndFileData := FStream.Position;
    48.   end;
    49. 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:
    1. FModule.Delete('bw_module');
    2. 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.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •