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.