Datei gesperrt durch AutoIT Prozess

  • Hallo zusammen,

    folgendes Problem:

    Client schreibt Logdatei in Verzeichnis

    Server liest LogDatei (in einer endlosschleife)

    Problem ist nun folgendes: Da am Server das Script in einer Endlosschleife läuft sind die Logdateien (TXT Dateien) gesperrt


    Selbst sowas hier funktioniert nicht....

    [autoit]

    FileOpen("test.txt",1)
    FileWrite("test.txt", "hallo liebe autoitler")
    FileClose("test.txt")
    While 1
    Sleep(100)
    WEnd

    [/autoit]

    Was mach ich falsch?

  • Hallo,
    dieses Schreiben-Skript ist nach dem Schreiben in einer ewigen Endlosschleife mit 'Nichtstun' beschäftigt. Ist das richtig????????

    Das Lese-Skript auf dem Server sollte die Datei wieder schließen, damit der Client wieder schreiben kann, z.B. so:
    (Hauptteile entnommen aus Hilfe: fileReadLine)

    [autoit]

    ; Server-Skript
    while 1
    $file = FileOpen("test.txt", 0)
    ; Check if file opened for reading OK
    If $file = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
    EndIf
    ; Read in lines of text until the EOF is reached
    While 1
    $line = FileReadLine($file)
    If @error = -1 Then ExitLoop
    MsgBox(0, "Line read:", $line)
    Wend
    FileClose($file)

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

    ;ggf. löschen damit Datei wieder leer
    fileDelete("test.txt")

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

    sleep(10000) ; = 10 sec. pause
    wend

    [/autoit]
  • naja das Script läuft etwas anders ab


    Client übergibt Array an TXT, Server liest TXT in Array und führt das Script aus (das lesen der TXT ist in der Endlosschleife)

    Nach erfolgreichen beenden schreibt er eine LogDatei und verschickt diese per E-mail

    Ung genau diese LogDatei ist immer gesperrt, FileClose überall (eigentlich sogar an zuvielen stellen) gesetzt ;( keine Chance Datei ist gesperrt


    [autoit]


    SERVER
    Func _log($logid)
    Select
    Case $logid = 1
    $logidtext = "blaa"
    ................
    Case $logid = 114
    $logidtext = "bla
    EndSelect
    $logfile = @ScriptDir & "\User-Löschung - " & $delusername & ".txt"
    FileOpen($logfile, 1)
    FileWrite($logfile, $logidtext & @CRLF)
    FileClose($logfile)
    $readlogdata = GUICtrlRead($loglabel)
    GuiCtrlSetData($loglabel, $readlogdata & @CRLF & $logidtext)
    EndFunc

    [/autoit]


    Genauso bei

    [autoit]


    Client
    Func _log($logid)
    Select
    Case $logid = 1
    $logidtext = "blaa"
    Case $logid = 101
    $logidtext = "bla"
    EndSelect
    $logfile = @ScriptDir & "\SAP-User-Löschung - " & $delusername & ".txt"
    FileOpen($logfile, 1)
    FileWrite($logfile, $logidtext & @CRLF)
    FileClose($logfile)
    If $logid = 4 Then
    _INetSmtpMailAuth($logid)
    EndIf
    EndFunc

    [/autoit]


    oder bei


    [autoit]


    Func _errorlog($errorid)

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

    If $errorid > 199 Then
    Select
    Case $errorid = 200
    $erroridtext = "bla"
    .................
    EndSelect
    $logfile = @ScriptDir & "\ServerError.txt"
    FileOpen($logfile, 1)
    FileWrite($logfile, $erroridtext & @CRLF)
    FileClose($logfile)
    Else

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

    Select
    Case $errorid = 1
    Case $errorid = 410
    $erroridtext = ""
    EndSelect
    $logfile = @ScriptDir & "\SAP-User-Löschung - " & $delusername & ".txt"
    FileOpen($logfile, 1)
    FileWrite($logfile, $erroridtext & @CRLF)
    FileClose($logfile)
    EndIf
    If $errorid > 100 Then
    _INetSmtpMailAuth($errorid)

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

    EndIf
    EndFunc

    [/autoit]


    Gesamt werden ca. 500 Errors geschrieben (per Select Case)

    Alle errors über 100 werden mir per E-Mail zugeschickt

    Logs werden dem User zugeschickt


    In der Funktion _INetSmtpMailAuth schicke ich das LogFile mit:

    [autoit]


    FileOpen($logfile, 0)
    $logfile4mail = FileRead($logfile, 99999999)
    FileClose($logfile)

    [/autoit]
  • Prüfe doch mal ob das Entsperren nur im Bereich des e-Mail-Versands nicht funktioniert???

    Ich mache in so einem Fall an verschiedenen Stellen ein Stopp mit msgbox() in das Skript.
    Bei jedem Stopp kannst du prüfen ob die Datei an der Stelle dann gesperrt ist,
    z.B. ganz einfach in dem Du versuchst sie per Explorer umzubenennen.

    So kannst Du die Fehlerquelle nach + nach eingrenzen.

    Noch ein Versuch:
    Mach mal ein Sleep() nach dem FileClose. Mit diesem Befehl habe auch schon viele Probleme lösen können. Vielleicht ist AutoIt einfach zu schnell :)

    Und noch ein Versuch:
    Was ich schon praktiziert habe bei gesperrten Dateien:
    Einfach kopieren (klappt manchmal trotzdem) und mit der Kopie weiterarbeiten.