Prüfen ob eine Programm eine Datei geöffnet hat

  • Hallo,
    ich habe ein Script welches in einer Schleife ein Verzeichnis auf Inhalt prüft.
    Wird eine Datei gefunden soll diese in ein anderes Verzeichnis verschoben werden.

    Mein Problem ist jetzt das es zwar Grundsätzlich funktioniert allerdings taucht ein Problem auf wenn die Datei gerade geschrieben wird und das Skript dann zuschlägt. Das führt in der Anwendung zu einem Zugriffsfehler.

    Da ich nicht genau sagen kann wielange die Anwendung braucht um eine Datei zu schreiben muß ich irgendwie prüfen ob die Datei noch geöffnet ist.
    Ein Wartezeit in der Schleife einzufügen bringt nicht das gewünschte Ergebnis, da der Prozess auch nicht länger als eine Minute dauern darf.
    Es muß also irgendwie eine Möglichkeit geben zu Prüfen ob die Datei noch "offen" ist.
    Mit autoit macht man soetwas ja auch mit Fileopen und Fileclose, allerdings weiß ich nicht wie ich das Abfangen kann.


    Hat da jemand ein Idee ?


    Hier das Script

    [autoit]


    dim $search, $dir ,$proformaspooler

    [/autoit][autoit][/autoit][autoit]

    While 1
    $dir = "C:\PRO_SPOOL\PRO_01\"
    $proformaspooler = "\\" & "server1" & "\PRO_01"
    SPOOL_CHECK()

    [/autoit][autoit][/autoit][autoit]

    WEnd

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func SPOOL_CHECK()

    [/autoit][autoit][/autoit][autoit]

    $search = FileFindFirstFile($dir & "*.*") ; Prüfen, ob die Suche erfolgreich war
    If $search = -1 Then
    Sleep(1)
    Else
    $searchfile = FileFindNextFile($search)
    if @error Then Sleep(1)
    $file = $dir & $searchfile
    ToolTip($proformaspooler & " - " & $searchfile)
    FileMove($file, $proformaspooler)
    EndIf

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit]

    Gruß
    Wolke

  • Du könntest mit

    [autoit]

    FileGetTime ( "filename" [, option [, format]] )

    [/autoit]

    prüfen, wann die Datei das letzte mal geöffnet wurde, das ganze in ner Schleife mit Timer. Wenn sich das Datum dann innerhalb von X Sekunden geändert hat, wird sie grade bearbeitet.

  • oder mit fileopen versuchen die Datei zu öffnen und dann die Reaktion auswerten.

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

  • mhh ich hätts jetzt ehrlich gesagt mit folgendem Ansatz gemacht:

    [autoit]

    #include <WinAPI.au3>

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $hFile = _WinAPI_CreateFile($sPath, 2)
    ConsoleWrite(_WinAPI_GetLastErrorMessage())

    [/autoit]


    Da siehst direkt als Error, dass die Datei von nem anderen Prozess verwendet wird.
    Wie man das dann geschickt einsetzt weißt du sicher selber...

  • So hat sbei mir geklappt.
    Gruß
    Sebastian

    [autoit]


    $completeFile = FileOpen($sPath & $aFiles[1], 1)
    ConsoleWrite($completeFile & @CRLF)
    If $completeFile = 1 Then
    FileClose($completeFile)
    ...
    EndIf

    [/autoit]
  • Zitat

    mhh, also bei mir gibt Autoit bei FileOpen das Handle zurück und das obwohl die Datei geöffnet ist. @error ist auch nicht gesetzt...


    Schade ich hätte nen error erwartet da schon offen, war nur so ne Idee aber eine funktionelle Lösung hat er ja nun.

    Gruß Dietmar

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

  • Der Trick ist vermutlich das die Datei mit einem Prozess außerhalb von AutoIt zusätzlich geöffnet wird.

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

  • Ich will ja jetzt nicht ewig auf dem Thema hier rumkauen, aber ich hab's jetzt ma beispielhaft versucht wenn python die Datei offen hat und dabei is trotzdem immernoch folgendes rausgekommen:

    Code
    FileOpen handle: 1
    @error: 0
    ---------------------
    CreateFile: Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird.
    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $sPath = @ScriptDir & "\test.txt"
    $hFile = FileOpen($sPath, 1)

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite("FileOpen handle: " & $hFile & @CRLF)
    ConsoleWrite("@error: " & @error & @CRLF & "---------------------" & @CRLF)
    If @error = 0 Then FileClose($hFile)

    [/autoit] [autoit][/autoit] [autoit]

    $hFile2 = _WinAPI_CreateFile($sPath, 2)
    ConsoleWrite("CreateFile: " & _WinAPI_GetLastErrorMessage() & @CRLF)
    _WinAPI_CloseHandle($hFile2)

    [/autoit]

    Also zumindest ich bekomm mit FileOpen nicht herraus, ob die Datei offen ist oder nicht...