Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#4

AW: Datei zippen/ entzippen: TZipmaster oder Abbrevia

  Alt 1. Jun 2016, 11:03
Hallo,
ich suche eine Möglichkeit, ein Zip-Archiv (normales zip, kein gzip oder 7zip)
zu entpacken und wieder ein Archiv zu erzeugen.

Das ganze möglichst direkt über Streams.

Im Moment nehme ich den Zipmaster.
Nachteil ist, dass ich halt keine Streams benutzen kann.
Es läuft immer auf Dateien aus.
Ich nehme auch immer den Zip-Master und das geht auch mit Streams.

Hier ein Auszug aus 'ner Klasse, mit der ich EPubs erstelle:
Delphi-Quellcode:
...

    // sEPubFilename ist der "Datei"-Name, unter dem der Stream im Zip-Archiv abgelegt wird.
    // Einen String, der eine vollständige Datei (HTML-Seite...) repäsentiert,
    // in die EPub-Datei übernehmen.
    function CopyToEPub(sInhalt : String; sEPubFilename : String) : Boolean; overload;
    // Inhalt einer Stringliste als Datei in die EPub-Datei übernehmen.
    function CopyToEPub(sl : TStrings; sEPubFilename : String) : Boolean; overload;
    // Einen Stream als Datei in die EPub-Datei übernehmen.
    // Hierbei kann es sich um alles handeln, was man in eine ZIP-Datei packen kann.
    function CopyToEPub(st : TMemoryStream; sEPubFilename : String) : Boolean; overload;
...


...
// Wir bekommen eine Zeichenfolge, die eine vollständige Seite enthält.
function TEPub.CopyToEPub(sInhalt : String; sEPubFilename : String) : Boolean;
var
         sl : TStringList;
         st : TMemoryStream;
begin
  sl := TStringList.Create;
  st := TMemoryStream.Create;
  try
    sl.Add(sInhalt);
    sl.SaveToStream(st);
    Result := CopyToEPub(st,sEPubFilename);
  finally
    st.Free;
    sl.Free;
  end;
end;

// Wir bekommen eine Stringliste, die eine vollständige Seite enthält.
function TEPub.CopyToEPub(sl : TStrings; sEPubFilename : String) : Boolean;
var
          st : TMemoryStream;
begin
  st := TMemoryStream.Create;
  try
    sl.SaveToStream(st);
    Result := CopyToEPub(st,sEPubFilename);
  finally
    st.Free;
  end;
end;

// Die Übernahme in das eBook kann nur per Stream erfolgen.
// Wir bekommen hier einen Stream, der eine vollständige Seite enthält.
// Es kann sich aber auch um Bilder... handeln, halt alles, was man in ein
// Zip packen kann.
function TEPub.CopyToEPub(st : TMemoryStream; sEPubFilename : String) : Boolean;
begin
  Result := false;
  if Assigned(fOnEPubMessage) then fOnEPubMessage(Self, Format('speichere %s...',[sEPubFileName]));
  Application.ProcessMessages;
  try
    try
      st.Position := 0;
      fZip.ZipStream.LoadFromStream(st);
      fZip.AddStreamToFile(sEPubFilename,0,FILE_ATTRIBUTE_ARCHIVE);
      st.Clear;
      Result := True;
      if Assigned(fOnEPubStatus) then fOnEPubStatus(Self, Format('%s wurde gespeichert.',[sEPubFileName]));
    except
      on e : Exception do begin
        if Assigned(fOnEPubException) then fOnEPubException(Self,'CopyToEPub: ' + e.Message)
        else raise Exception.Create(e.Message) at @TEPub.CopyToEPub;
      end;
    end;
  finally
  end;
  Application.ProcessMessages;
end;
...
Oder meintest Du mit Deiner Fragestellung, dass Du die ZIP-Datei als Stream verwenden willst, also das Archiv selbst nur im Speicher existiert und nicht als Datei?
  Mit Zitat antworten Zitat