Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   ZIP-Forge Datei zippen im MemoryStream (geöffnete Dateien) (https://www.delphipraxis.net/190508-zip-forge-datei-zippen-im-memorystream-geoeffnete-dateien.html)

Jim Carrey 11. Okt 2016 15:55

AW: ZIP-Forge Datei zippen im MemoryStream (geöffnete Dateien)
 
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.

Codehunter 12. Okt 2016 10:30

AW: ZIP-Forge Datei zippen im MemoryStream (geöffnete Dateien)
 
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.

Jim Carrey 12. Okt 2016 10:46

AW: ZIP-Forge Datei zippen im MemoryStream (geöffnete Dateien)
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:12 Uhr.
Seite 2 von 2     12   

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