![]() |
fileExists zu schnell?
Hallo,
ich möchte ein .tar.gz-File, nennen wir es Beispiel.tar.gz, entpacken. Dazu rufe ich externe kommandozeilen basierende Programme auf. Zuerst muss ich das gz-File entpacken. Das mache ich mit Gunzip.exe Danach soll das durch Gunzip enstandene tar-File entpackt werden. Das mache ich mit 7z.exe Dabei habe ich festgestellt, das 7z scheinbar schon aufgerufen wird, wenn noch gar kein tar-File voliegt. Daher habe ich nach der gz-Entpackroutine folgendes eingebaut:
Delphi-Quellcode:
Aber das reicht scheinbar immer noch nicht, selbst wenn die Schleife beendet wird, bekommt 7z.exe das tar-File noch nicht zu packen. Erst wenn ich ein Sleep(100) nach der Schleife einbaue, wird das tar-File korrekt entpackt.
repeat until fileExists('Beispiel.tar');
Kann es sein, dass fileExists schon true liefert, wenn das tar-File noch gar nicht auf der Festplatte und damit für 7z.exe nicht ladbar, vorliegt? Gruß Gambit |
Re: fileExists zu schnell?
ist eigentlich alles ganz logich, damit in die 'Beispiel.tar' geschrieben werden kann muss diese natürlich erst angelegt werden. Sobald diese angelegt ist wird natürlich bei fileexists schon true zurück geliefert was ja aber nicht heißt das schon in die 'Beispiel.tar' geschrieben wurde. Ich würde dir empfehlen einfach mit der auführung des folgeprogrammes zu warten bis das erste beendet wurde.
|
Re: fileExists zu schnell?
Tja, aber woher weiß ich, dass Gunzip fertig ist? Deswegen hatte ich ja die Scheife zwischen den Aufruf der beiden Programme geschrieben. Ich rufe Gunzip folgendermaßen auf:
Delphi-Quellcode:
und der Aufruf dann:
Procedure TForm1.DecompressFiles(applicationName, s: String);
var SI: TStartupInfo; PI: TProcessInformation; AppHWnd :HWND; ProcessId: DWORD; I: Integer; begin AppHWnd := 0; FillChar(SI, SizeOf(TStartupInfo), 0); SI.cb := SizeOf(TStartupInfo); SI.dwFlags := STARTF_USESHOWWINDOW; SI.wShowWindow := SW_HIDE; if CreateProcess(nil, PChar(extractFilePath(application.ExeName)+applicationName+s), nil, nil, False, 0, nil, nil, SI, PI) then begin WaitForInputIdle(PI.hProcess, INFINITE); CloseHandle(PI.hProcess); CloseHandle(PI.hThread); end; end;
Delphi-Quellcode:
und danach jetzt mal ohne die repeat until-Schleife:
DecompressFiles('gunzip ', extractFileName(FileList.Strings[i]));
Delphi-Quellcode:
DecompressFiles('7z x ', ansiReplaceStr(extractFileName(FileList.Strings[i]),
extractFileExt(extractFileName(FileList.Strings[i])), '')); |
Re: fileExists zu schnell?
such hier mal im forum nach createProcess, denn in dem zusammenhang gibts irgendwie sowas wie "waitforsingleobject" oder so ähnlich was bewirk das, das programm an der stelle wartet bis das programm welches mit createprocess gestartet wurde beendet ist.
|
Re: fileExists zu schnell?
ja, WaitForSingleObject scheint zu helfen. Danke!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:36 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