Datei wird nicht gelöscht

  • Hallo, das folgende Script soll eine Datei nach einer Bestimmten Zeile durchsuchen, und anbieten diese Zeile zu bearbeiten. Dies funktioniert alles soweit, nur soll eine zweite .tmp Datei erstellt werden in der die Änderungen vorgenommen werden, dann die originale Datei gelöscht, und die die .tmp umbenannt werden ohne .tmp.

    Die .tmp Datei wird richtig erstellt aber das FileDelete funktioniert nicht. Rückgabewert ist 1 (Erfolgreich), aber die Datei wird erst gelöscht nachdem das Script beendet wird. Ich habe keine Idee wieso.

    Grüße

    [autoit]

    #include <GUIConstantsEx.au3>
    #include <EditConstants.au3>

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

    Opt('MustDeclareVars', 1)
    Opt('GUIOnEventMode', 1)

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

    #region $Vars
    Local $hGUI
    Local $hMenu
    Local $hMenu_Exit
    Local $hMenu_Help
    Local $hMenu_About
    Local $hButton_PickFile
    Local $sInput_PickFile
    Local $hButton_SaveFile
    Local $sInput_SaveFile
    Local $hLabel_Id
    Local $sLabel_Id
    Local $sInput_Newline
    Local $msg
    Global $iId = 308
    #endregion $Vars

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

    $hGUI = GUICreate("EditFile", 335, 220)
    $hMenu = GUICtrlCreateMenu("File")
    $hMenu_Exit = GUICtrlCreateMenuItem("Exit", $hMenu)
    $hMenu_Help = GUICtrlCreateMenu("?")
    $hMenu_About = GUICtrlCreateMenuItem("About", $hMenu_Help)
    $hButton_PickFile = GUICtrlCreateButton("Pick file", 10, 10, 80, 20)
    $sInput_PickFile = GUICtrlCreateInput("", 95, 10, 230, 20, $ES_READONLY)
    $hButton_SaveFile = GUICtrlCreateButton("Save file", 10, 35, 80, 20)
    $hLabel_Id = GUICtrlCreateLabel("Kennziffer:", 10, 60, 60, 20)
    $sLabel_Id = GUICtrlCreateLabel($iId, 70, 60, 60, 20)
    $sInput_Newline = GUICtrlCreateEdit("", 10, 80, 315, 110)

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

    GUISetState() ; will display an dialog box with 2 button
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit", $hGUI)
    GUICtrlSetOnEvent($hButton_PickFile, "_FileRead")
    GUICtrlSetOnEvent($hButton_SaveFile, "_FileSave")

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

    ; Run the GUI until the dialog is closed
    While 1
    Sleep(100)
    WEnd

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

    Func _FileRead()
    Local $hPickedFile
    Local $hFile
    Local $sLine

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

    $hPickedFile = FileOpenDialog("", @FavoritesDir & "", "All (*.txt)")
    GUICtrlSetData($sInput_PickFile, $hPickedFile)
    $hFile = FileOpen($hPickedFile)
    While 1
    $sLine = FileReadLine($hFile)
    If @error = -1 Then ExitLoop
    If StringLeft($sLine, 3) = $iId Then GUICtrlSetData($sInput_Newline, StringMid($sLine, StringLen($iId)+1, StringLen($sLine)))
    WEnd
    EndFunc

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

    Func _FileSave()
    ;Original Datei öffnen
    Local $hOfile = FileOpen(GUICtrlRead($sInput_PickFile), 0)
    If $hOfile = -1 Then
    MsgBox(0, "Fehler", "Datei konnte nicht geöffnet werden." & " Bitte überprüfen Sie, ob die Datei bereits genutzt wird.")
    Return 0
    EndIf

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

    ;Tmp Datei erstellen/öffnen
    Local $hTmpfile = FileOpen(GUICtrlRead($sInput_PickFile) & ".tmp", 2)
    If $hTmpfile = -1 Then
    MsgBox(0, "Fehler", "Temporäre Datei konnte nicht angelegt werden.")
    Return 0
    EndIf

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

    While 1
    Local $sLine = FileReadLine($hOfile)
    If @error = -1 Then ExitLoop
    If StringLeft($sLine, 3) = $iId Then
    FileWriteLine($hTmpfile, $iId & GUICtrlRead($sInput_Newline))
    Else
    FileWriteLine($hTmpfile, $sLine)
    EndIf
    WEnd

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

    FileClose($hOfile)
    FileClose($hTmpfile)

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

    MsgBox(0,"1",FileDelete(GUICtrlRead($sInput_PickFile)))
    ;~ MsgBox(0,"2",FileMove(GUICtrlRead($sInput_PickFile) & ".tmp", GUICtrlRead($sInput_PickFile), 1))
    EndFunc

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

    Func _Exit()
    Exit
    EndFunc

    [/autoit]

    Grüße Yaerox

    Grüne Hölle

    2 Mal editiert, zuletzt von Yaerox (13. Februar 2013 um 21:58)

  • Liegt sehr wahrscheinlich daran, dass du in deiner Funktion _fileread() ein Handle für die Datei öffnest, welches nie geschlossen wird (erst automatisch beim Beenden des Scripts). Lösung dürfte also ein simples fileclose($hfile) sein.

    Grundsätzlich ist dein Script aber ohnehin eher ineffizient. Wenn du schon in _fileread() in der Datei rumliest um die Zeile zu finden könntest du dir die Zeilennummer auch gleich speichern um sie später direkt zu ersetzen. Wenn du unbedingt eine tmp Datei als Zwischenschritt willst würde ich die Datei komplett kopieren (filecopy) und dann die Zeile die du dir vorher gemerkt hast überschreiben.

    Alternativ bietet sich für eher kleine Textdateien auch das hier an:

    [autoit]


    dim $aData
    _filereadtoarray($file,$aData)
    $zeile = _arraysearch($aData,...)
    $aData[$zeile]="neuer text"
    _filewritefromarray($file & ".tmp",$aData,...)
    ...

    [/autoit]
  • Ich habe in der FileSave Funktion die ganze Zeit nach solchen banalen dummen Fehlern gesucht, och Gott -.- Das FileClose im FileRead ist die Lösung ^^

    Danke

    Grüße Yaerox

    Grüne Hölle