AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls ZIP-Forge Datei zippen im MemoryStream (geöffnete Dateien)

ZIP-Forge Datei zippen im MemoryStream (geöffnete Dateien)

Ein Thema von Jim Carrey · begonnen am 10. Okt 2016 · letzter Beitrag vom 12. Okt 2016
Antwort Antwort
Jim Carrey
(Gast)

n/a Beiträge
 
#1

AW: ZIP-Forge Datei zippen im MemoryStream (geöffnete Dateien)

  Alt 11. Okt 2016, 09:17
Ich habe das gerade mal so versucht
Delphi-Quellcode:
ZipForge1.OpenArchive(fmCreate);

// Statt ZipForge1.AddFiles(aFileName); nun ...

// for ... alle meine Daten
aFileStream := TFileStream.Create(aFileName, fmOpenRead); // fmOpenRead statt fmOpenWrite
ZipForge1.AddFromStream(aFileName, aFileStream);
aFileStream.Free;
// ende for

ZipForge1.CloseArchive;
Leider ist das Archiv dann leer. Ich habe bestimmt einen sau-blöden Fehler gemacht und sehe ihn nicht.
Das Archiv war nur leer, weil ich am Ende der For-Schleife noch ein aMemoryStream.SaveToFile() vom alten MemoryStream stehen hatte.


Edit: ich sehe gerade ZipForge1.AddFromStream() hat leider einen Bug und ist unbrauchbar.
Die Option ZipForge1.Options.StorePath := spRelativePath; wird bei AddFromStream komplett ignoriert.
Außer aber man entfernt durch String-Replace das BaseDir aus aFileName, dann ist es OK.

Geändert von Jim Carrey (11. Okt 2016 um 09:48 Uhr)
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#2

AW: ZIP-Forge Datei zippen im MemoryStream (geöffnete Dateien)

  Alt 11. Okt 2016, 10:16
Das funktioniert jetzt soweit sehr gut.
Auch wenn es umständlich ist.

Delphi-Quellcode:
aMemoryStream := TMemoryStream.Create;
ZipForge1.OpenArchive(aMemoryStream, True);

aFileStream := TFileStream.Create(aCurrItem.sSourceDirItem, fmOpenRead);
try
 ZipForge1.AddFromStream(StringReplace(aFileName, ZipForge1.BaseDir, ''), aFileStream);
finally
 aFileStream.Free;
end;

ZipForge1.CloseArchive;
aMemoryStream.SaveToFile(ZipForge1.FileName);
Einzige unschöne Nebenwirkung ist, dass wenn man große Dateien zippen möchte man die Meldung bekommt "Zu wenig Arbeitsspeicher".
Aber das ist wohl der bittere Nebengeschmack denke ich. Ab circa 500MB im Taskmanager bekomme zumindest ich die Meldung.

Dann werde ich wohl jetzt eine Art Kreuzung einbauen die bei Verzeichnissen, sagen wir mal, bis zu Größe-X mit dem FileStream zippt und sonst normal.
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.291 Beiträge
 
Delphi 12 Athens
 
#3

AW: ZIP-Forge Datei zippen im MemoryStream (geöffnete Dateien)

  Alt 11. Okt 2016, 12:21
"Zu wenig Arbeitsspeicher" [....] Ab circa 500MB im Taskmanager bekomme zumindest ich die Meldung.
Nur mal so interessenhalber: Tritt der Fehler auch auf wenn du als 64 Bit kompilierst?
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#4

AW: ZIP-Forge Datei zippen im MemoryStream (geöffnete Dateien)

  Alt 11. Okt 2016, 13:11
Daran habe ich noch nicht gedacht. Aber nein, da passiert es nicht.

Ich habe eben den Compiler-Schalter {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} gefunden. Mit dem klappt auch das Komprimieren von 500MB+ großen Dateien.
Ohne ihn nicht.

Kann dieser Schalter irgendwelche Nebenwirkungen hervorufen?

Geändert von Jim Carrey (11. Okt 2016 um 14:21 Uhr)
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#5

AW: ZIP-Forge Datei zippen im MemoryStream (geöffnete Dateien)

  Alt 11. Okt 2016, 15:55
Ich habe eben zufälligerweise auch mitbekommen, dass das Programm die eigene Programmdatei trotzdem nicht zippen kann, obwohl ich die Datei mit fmOpenRead in den Stream lade.
Die Fehlermeldung lautet, dass das Handle ungültig sei.
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.291 Beiträge
 
Delphi 12 Athens
 
#6

AW: ZIP-Forge Datei zippen im MemoryStream (geöffnete Dateien)

  Alt 12. Okt 2016, 10:30
Wäre mal zu probieren, die eigene Programmdatei vor dem Zippen per ScriptingHost (ShFileOperation) zu kopieren und die kopierte Datei zu zippen. Solange eine Exe läuft, hat das System einen exklusiven Zugriff auf die Datei. Da kommst du nicht ran mit einem Programm das im Benutzerkontext läuft. Der ScriptingHost läuft im System und sollte es können.
Delphi-Quellcode:
uses Winapi.Shellapi;

function dwCopyDirFile(const Src, Dst: String; const GUI, SimpleGUI, CopyConfirmation, MkDirConfirmation, ErrorGUI: Boolean; var UserHasCancelled: Boolean): Boolean;
var
  FOS : TSHFileOpStruct;
  Flags: Word;
begin
   Flags:= 0;
   if GUI then if SimpleGUI then Flags:= Flags or FOF_SIMPLEPROGRESS
          else Flags:= Flags or FOF_SILENT;
   if not CopyConfirmation then Flags:= Flags or FOF_NOCONFIRMATION;
   if not MkDirConfirmation then Flags:= Flags or FOF_NOCONFIRMMKDIR;
   if not ErrorGUI then Flags:= Flags or FOF_NOERRORUI;
   ZeroMemory(@FOS,SizeOf(FOS));
   with FOS do begin
      wFunc := FO_COPY;
      fFlags := Flags;
      pFrom := PChar(ExcludeTrailingBackslash(Src) + #0);
      pTo := PChar(ExcludeTrailingBackslash(Dst));
   end;
   RESULT := (0 = ShFileOperation(FOS));
   UserHasCancelled:= FOS.fAnyOperationsAborted;
end;
Bzgl. des Speicherproblems dürfte es eigentlich selbsterklärend sein: Je nach dem wie die ZIP-Routinen implementiert sind alloziieren sie evtl. so viel Speicher wie die unkomprimierten Daten groß sind. Die 500 MB sind ja nur das Endresultat des Komprimierens. Bei einem 32-Bit-System wäre da spätestens bei 3 GB RAM Schluss, wahrscheinlich aber eher bei 2 GB. Es gibt richtige Streamzipper die können das besser, aber auch da ist irgendwann Sense bei 32 Bit. Auch ein Grund warum wir bei uns nur noch 64 Bit ausliefern.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Jim Carrey
(Gast)

n/a Beiträge
 
#7

AW: ZIP-Forge Datei zippen im MemoryStream (geöffnete Dateien)

  Alt 12. Okt 2016, 10:46
Danke das werde ich mal ausprobieren.

Das Speicherproblem habe ich vorerst mit dem Setzen von {$SETPEFLAGS IMAGE_FILE_LARGE_ADDRESS_AWARE} behoben.
Der Speicherverbrauch geht jetzt schon einmal bis 1GB und mehr. Vorher konnte eine 500MB Datei nicht komprimiert werden, jetzt schon.
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz