Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   TZipmaster: LoadFromStream(Zip-Datei) und dann Datei entpacken (https://www.delphipraxis.net/176494-tzipmaster-loadfromstream-zip-datei-und-dann-datei-entpacken.html)

hoika 10. Sep 2013 08:25

TZipmaster: LoadFromStream(Zip-Datei) und dann Datei entpacken
 
Hallo,

ich versuche, dem Zipmaster (1.9) eine gezippte Datei "unterzuschieben",
die in einem TFileStream bzw. TMemoryStream (aus einem Blob-Feld) liegt.
Dann soll eine Datei (die einzige in der Zip) ausgepackt werden

Hier war schon eine ähnliche Frage, ohne Antwort ...

http://www.delphipraxis.net/99880-tz...-anwenden.html

Ich stehe genau dort, das er mir die gezippte Datei "auspackt".

Hier
http://www.freelists.org/post/delphizip/Hello,860
wird ein gezippter Stream entpackt,
aber es steht auch dort, wenn der Stream eine Zip-Datei ist,
klappt der Code nicht.

Man müsste aus dem Stream der Zipdatei genau die Stelle kennen,
wo die Zip-Datei beginnt.

Hier habe ich noch was, verstehe aber nicht ganz,
was der macht ;(

http://quide.googlecode.com/svn/trun...ileStorage.pas

Per LoadFromFile klappt ja alles.

Danke


Heiko

ralfschwalbe 10. Sep 2013 08:55

AW: TZipmaster: LoadFromStream(Zip-Datei) und dann Datei entpacken
 
Eigentlich weiß man doch, "wo" die "Zip"-Datei beginnt: http://en.wikipedia.org/wiki/Zip_(fi...)#File_headers

nahpets 10. Sep 2013 11:10

AW: TZipmaster: LoadFromStream(Zip-Datei) und dann Datei entpacken
 
Hallo,

suchst Du sowas?

Delphi-Quellcode:
procedure TfmSHSMain.acSeiteSpeichernExecute(Sender: TObject);
var
          Zip         : TZipMaster;
          st          : TZipStream;
begin
  Screen.Cursor := crHourGlass;
  st           := TZipStream.Create;
  Zip          := TZipMaster.Create(Nil);
  Try
    try
      Zip.NotMainThread := false;
      Zip.Unattended   := True;
      Zip.DLLDirectory := fDll_Path;
      Zip.ZipFileName  := Application.HelpFile;
      Zip.AddOptions   := Zip.AddOptions + [AddDirNames];
      mtIndex.Locate('ID', edSeite.Tag, []);
      meTextEditor.Lines.SaveToStream(st);
      st.Position      := 0;
      Zip.ZipStream.LoadFromStream(st);
      Zip.AddStreamToFile(edSeite.Text,0,FILE_ATTRIBUTE_ARCHIVE);
      wb.Navigate('http://localhost:' + IntToStr(hs.DefaultPort) + '/' + IntToStr(edSeite.Tag));
      wb.Refresh;
    except
      on e : Exception do begin
        WebConfig.WriteToLogFile('acSeiteSpeichernExecute: ' + e.Message);
      end;
    end;
  finally
    Zip.Free;
  end;
  meTextEditorChange(Nil);
  stbTexteditor.Panels[0].Color := clGreen;
  Screen.Cursor := crDefault;
end;
mtIndex ist eine kbMemTable (eine Datenbanktabelle, die nur im Arbeitsspeicher existiert).
meTextEditor ist ein DBMemo, das mit der Tabelle mtIndex verbunden ist und den Inhalt eines Memofeldes anzeigt (HTML-Dateien).
wb ist ein TWebBrowser, der die HTML-Dateien aus meTextEditor anzeigt.
edSeite.Text ist eine TDBEdit, das den Namen der HTML-Datei im ZIP-Archiv enthält.
edSeite.Tag enthält den technischen Schlüssel der HTML-Datei in der Datenbanktabelle.

hoika 10. Sep 2013 15:56

AW: TZipmaster: LoadFromStream(Zip-Datei) und dann Datei entpacken
 
Hallo,

danke an beide,
ich schaue es mir an.
Ich glaueb, so langsam versteht ich das AddStreamToFile .

PS: ich weiss nicht, wo die Datei beginnt, das soll doch der Zipmaster machen ... ;)


Heiko

nahpets 10. Sep 2013 17:45

AW: TZipmaster: LoadFromStream(Zip-Datei) und dann Datei entpacken
 
Hallo,

habe glaub' ich beim ersten Lesen Deine Aufgabenstellung nur halb gelesen oder verstanden... :-(

Du hast das Zip im Blob und willst dieses an den Zipmaster geben um dann daraus eine Datei zu extrahieren.

Meine Routine schreibt aber den Inhalt aus einem DBMemo als Datei in ein ZIP, ist also für Deine Aufgabenstellung überhaupt nicht zu gebrauchen :-(

hoika 10. Sep 2013 17:53

AW: TZipmaster: LoadFromStream(Zip-Datei) und dann Datei entpacken
 
Hallo,

passt scho ;)
ich muss auch die andere Seite bauen,
also Datei als TFileStream vorhanden, soll gezippt (=Zip-Datei) und in die DB geschrieben werden.

ich konnte den Code nach einem Umbau auch bei mir verwenden
aber:

Jedesmal wird vom Zipmaster in eine Datei geschrieben,
lasse ich das ZipFileName weg, bekomme ich beim AddStreamToFile eine Fehlermeldung "zip file name fehlt".

Ich möchte, dass der das alles im Speicher hält.
Ich vermisse ein LoadZipFileFromStream und ein SaveZipFileToStream .

Kann Abbrevia das ?


Aktuell:
Komponente(z.B. auch ein Texteditor) -> SaveToFile Datei -> TZipmaster -> ZipDatei erzeugen als Datei -> BlobStream.LoadFrom File -> in die DB

Ziel:
Komponente(z.B. auch ein Texteditor) -> SaveToStream -> TZipmaster -> ZipDatei erzeugen als Stream -> in die DB


Ich möchste also alle File-Operationen eliminieren.


Danke


Heiko

cookie22 10. Sep 2013 18:10

AW: TZipmaster: LoadFromStream(Zip-Datei) und dann Datei entpacken
 
Wenn du nur Streams comprimieren willst, warum benutzt du dann DelZip und nicht ZLib?

nahpets 10. Sep 2013 18:20

AW: TZipmaster: LoadFromStream(Zip-Datei) und dann Datei entpacken
 
Hallo,

habe mal noch ein bisserl gestöbert und dabei ist folgende, ungetestete, Funktion rausgekommen (nur so als Idee):
Delphi-Quellcode:
function GetZipContent(DBMemo : TDBMemo; sFileNameImZip : String) : String;
var
    st       : TZipStream;
begin
  DBMemo.Lines.SaveToStream(st);
  st.Position := 0;
  ZipMaster1.ZipStream.LoadFromStream(st);
  st.Clear;
  st := ZipMaster1.ExtractFileToStream(sFileNameImZip);
  if ZipMaster1.SuccessCnt <> 0 then begin
    if st.Size > 0 then begin
      st.Position := 0;
      SetLength(sContent, st.size);
      st.Read(sContent[1], st.size);
    end else begin
      Result := 'Die Datei ' + sFileNameImZip + ' hat keinen Inhalt.';
    end;
  end else begin
    Result := 'Die Datei ' + sFileNameImZip + ' wurde nicht gefunden.';
  end;
end;
Eventuell ist's ja ein Ansatz.

hoika 11. Sep 2013 22:27

AW: TZipmaster: LoadFromStream(Zip-Datei) und dann Datei entpacken
 
Hallo,

cookie22
ich muss den Code weiterentwickeln, das Original kommt nicht von mir.
Ich habe eine Komponente, die kann LoadFromFile/LoadFromStream mit einer RTF-Datei/-Stream.
Die RTF liegt als Zip-Datei (TZipmaster) in einem Boob-Feld in der DB.
Im Moment wird die Zip-Datei ins Temp kopiert, die RTF-Datei ausgepackt
und dann per LoadFromFile in die Komponente geladen.

Mir wäre es lieber, auf die Temp-Datei komplett zu verzichten.


nahpets
Ja, kommt meinen Wünschen schon sehr naha, ich teste es mal.
Danke!



Heiko

hoika 6. Nov 2014 08:35

AW: TZipmaster: LoadFromStream(Zip-Datei) und dann Datei entpacken
 
Hallo,

was lange währt ...
Die aktuelle Version 1.92 hat ein Property ExtStream.
Dem kann man jetzt die Zip-Datei als TFileStream übergeben.
Bei sämtlichen Stream-Funktionen muss man nur aufpassen,
Stream.Position ggfs. auf 0 zurückzusetzen.

Clevererweise haben die Entwickler auch die Dateinamen komplett geändert,
so dass man die 1.92 übergangsweise zusammen mit der 1.90 verwenden kann.

Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:32 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz