Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi fileExists zu schnell? (https://www.delphipraxis.net/43868-fileexists-zu-schnell.html)

Gambit 9. Apr 2005 22:25


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:
repeat until fileExists('Beispiel.tar');
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.

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

SirThornberry 9. Apr 2005 22:31

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.

Gambit 9. Apr 2005 22:42

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:
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;
und der Aufruf dann:

Delphi-Quellcode:
DecompressFiles('gunzip ', extractFileName(FileList.Strings[i]));
und danach jetzt mal ohne die repeat until-Schleife:

Delphi-Quellcode:
DecompressFiles('7z x ', ansiReplaceStr(extractFileName(FileList.Strings[i]),
                         extractFileExt(extractFileName(FileList.Strings[i])), ''));

SirThornberry 9. Apr 2005 22:44

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.

Gambit 9. Apr 2005 22:59

Re: fileExists zu schnell?
 
ja, WaitForSingleObject scheint zu helfen. Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:52 Uhr.

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