Ordner löschen klappt nicht ganz

  • Irgendwie will das nicht klappen, wenn ich den Ordner lösche ($Pfad) bleiben noch Unterverzeichnisse/Dateien über, obwohl eigentlich der Parameter (1) angegeben ist ?( Vielleicht ist ja auch nur ein Denkfehler drin?

    Spoiler anzeigen
    [autoit]

    $Pfad = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Candela", "InstallLocation")
    $Path = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Candela", "Programsdir")
    ProcessClose("Candela.exe")
    If FileExists(@TempDir & "\CandelaUI.exe") = 0 Then
    FileCopy(@ScriptFullPath, @TempDir & "\CandelaUI.exe", 1)
    Run(@TempDir & "\CandelaUI.exe")
    Exit
    Else
    RegDelete("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Candela")
    DirRemove($Path, 1)
    DirRemove($Pfad, 1)
    MsgBox(0, "Uninstall", "Successful")
    Call("_SelfDelete")
    EndIf
    Func _SelfDelete($iDelay = 0)
    Local $sCmdFile
    FileDelete(@TempDir & "\scratch.bat")
    $sCmdFile = 'ping -n ' & $iDelay & '127.0.0.1 > nul' & @CRLF _
    & ':loop' & @CRLF _
    & 'del "' & @ScriptFullPath & '"' & @CRLF _
    & 'if exist "' & @ScriptFullPath & '" goto loop' & @CRLF _
    & 'del ' & @TempDir & '\scratch.bat'
    FileWrite(@TempDir & "\scratch.bat", $sCmdFile)
    Run(@TempDir & "\scratch.bat", @TempDir, @SW_HIDE)
    EndFunc

    [/autoit]
  • Hallo Aquaplant,

    ändere einmal wie folgt ab:

    [autoit]

    ;Zeile 9
    $iOK1 = DirRemove($Path, 1)
    $iOK2 = DirRemove($Pfad, 1)
    if ($iOK1 = 1) and ($iOK2) = 1 then MsgBox(0, "Uninstall", "Successful")

    [/autoit]

    dann erhälts du keine falsche Erfolgsmeldung. Zum eigentlichen Problem: kann es sein dass du (oder ein Programm) eine Datei in einem dieser Pfade sperrst????

    mfg Auto)Bert

  • Nein kann (eigentlich) nicht sein. Das Programm welches die Dateien verwenden könnte wird schon geschlossen (Processclose). Es befinden sich sonst nur *.txt *.ini *.bmp und *.dat
    Was sein kann ist, dass die Deinstallationsexe das sperrt, aber dafür hab ich ja extra den Umweg mit dem @tempdir

  • Alle Möglichekeiten die man die genannt hat, schließt Du ja aus !

    Es gibt meines Wissens nach nur diese Probleme, die das Löschen eines Ordners unter Windows verhindern:

    1. Eine darin befindliche Datei oder ein darin befindlicher Ordner ist in Benutzung eines laufenden Prozesses. Kann z.B. aber auch sein, das eine DLL aus dem Ordner nachgeladen wird, die beim ProcessClose() nicht mit entladen wird und daher weiterhin aktiviert bleibt. Gutes Tool hierfür ist: ProcessExplorer.
    2. Der Ordner ist durch ein anderes Programm oder ein Explorer-Fenster derzeit geöffnet.
    3. Der Ordner ist in der Registry als zu schützender Ordner markiert. Ich weiß derzeit aber nicht mehr, wo das eingetragen wurde. z.B. Ordner für die Windows-Systemdateien sind so geschützt.

    Ansonsten fällt mir auch nichts mehr ein.

    Edit: Einen habe ich noch. Jemand hat aus dem Ordner ein AutoIt-Script gestartet, in welchem ein Run() ausgeführt wird. Wenn man bei diesem Run() nicht z.B. @TempDir als Arbeitsverzeichnis mitgibt, wird das @ScriptDir als Arbeitsverzeichnis. Dies ist dann der aktuelle Ordner und der lässt sich dann erst nach Ende der Run() wieder löschen.

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Moin,

    beim durchsehen Deines Skriptes sticht mir folgendes ins Auge:
    Ist die CandelaUI.exe von Dir oder von Candela?

    Ansonsten bleibt gffs zum Debuggen nur die Dateien mit _FilelIstToArray einzulesen und mit _FileInUse () zu testen, ob irgendeine in Benutzung ist.

    [autoit]


    Func _FileInUse($sFilename)
    ; author: Siao
    Local $aRet, $hFile
    $aRet = DllCall("Kernel32.dll", "hwnd", "CreateFile", _
    "str", $sFilename, _ ;lpFileName
    "dword", 0x80000000, _ ;dwDesiredAccess = GENERIC_READ
    "dword", 0, _ ;dwShareMode = DO NOT SHARE
    "dword", 0, _ ;lpSecurityAttributes = NULL
    "dword", 3, _ ;dwCreationDisposition = OPEN_EXISTING
    "dword", 128, _ ;dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL
    "hwnd", 0) ;hTemplateFile = NULL
    $hFile = $aRet[0]
    If $hFile = -1 Then ;INVALID_HANDLE_VALUE = -1
    $aRet = DllCall("Kernel32.dll", "int", "GetLastError")
    SetError($aRet[0])
    Return 1
    Else
    ;close file handle
    DllCall("Kernel32.dll", "int", "CloseHandle", "hwnd", $hFile)
    Return 0
    EndIf
    EndFunc ;==>_FileInUse

    [/autoit]

    ;-))
    Stefan

  • Hi,

    gffs. hilft ein sleep (30000) oder mehr nach dem Processclose. Machmal dauert es ein Zeit bis alle Handles eines Prozesses geschlossen sind.

    ;-))
    Stefan