Windows Explorer (Dateiexplorer) zum schliessen überreden

  • Ich hab einfach keine idee wie

    Ich habe zb den ordner "C:\test\bar\foo\doof\kein\plan"

    ich möchte nun zb ab "C:\test\bar\" alles rekrusiv löschen

    Geht auch soweit leider nicht wenn der Explorer in einem von diesen bereich offen ist

    Nach nun 4 stunden testen + googel setze ich auf euch ;)

    Wie kriege ich das hin das er zb das Fenster schliesst wenn ich mich im order "kein (C:\test\bar\foo\doof\kein\)"
    befinde

    Taskkill ist mir ein wenig zu heftig
    anhand des Titels ist das auch schlecht da es den titel ja mehrmals geben kann

    Eine Idee ?

    2 Mal editiert, zuletzt von Gummibaer (3. August 2009 um 23:09)

  • Hallo
    Du kannst über das Edit(EDIT1)Feld des Explorers den aktuellen Pfad auslesen und mit send String und Enter ein neues Verzeichnis auswählen. Ein anderer Weg wäre den Explorer zu schließen und durch FileDelete das Verzeichnis zu löschen und anschließend den Explorer wieder zu starten.
    Gruß Ralf

  • oder versuch es mal mit SHFileOperation. Im Explorer kann man ja auch geöffnete Ordner löschen ...
    (Dazu müsste es im deutschen oder englischen Forum ein paar Beispiele geben)

  • Zitat von funkey


    Wenn du beim Explorer unter Extras|Ordneroptionen|Ansicht|Vollständigen Pfad in der Titelleiste anzeigen anwählst, dann kommst du vllt weiter ;)
    Vergleiche dannn einfach den zu löschenden Pfad mit der Titelleiste des Explorer-Fensters mittels StringInStr.

    Tolle Idee aber wird nichts draus ..
    Da das nicht nur bei mir laufen soll sondern auch bei anderen.
    inc vista

    Zitat von Flarkus


    Hallo
    Du kannst über das Edit(EDIT1)Feld des Explorers den aktuellen Pfad auslesen und mit send String und Enter ein neues Verzeichnis auswählen. Ein anderer Weg wäre den Explorer zu schließen und durch FileDelete das Verzeichnis zu löschen und anschließend den Explorer wieder zu starten.
    Gruß Ralf


    Situtation du hast 20 Ordner offen ?


    Den Explorer abzuschiessen will ich ja vermeiden....

  • Folgendes sollte unahängig von der Windows-Version funktionieren:

    Spoiler anzeigen
    [autoit]

    Opt("WinTitleMatchMode", 4)
    Global $ShellObject = ObjCreate("Shell.Application")
    Global $Pfade = ''

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

    $WinList = WinList('[REGEXPCLASS:(Cabinet|Explore)WClass]')
    For $i = 1 To $WinList[0][0]
    $Pfade &= _GetExplorerWinOpenedPath($WinList[$i][1], $ShellObject) & @CRLF
    Next

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

    MsgBox(0, "", "Pfade geöffneter Explorer-Fenster:" & @CRLF & @CRLF & $Pfade)

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

    Func _GetExplorerWinOpenedPath($WinHandle, ByRef $ShellObject)
    If (Not IsObj($ShellObject)) And (Not ObjName($ShellObject) == 'IShellDispatch4') Then Return SetError(1, 0, '')

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

    For $Window In $ShellObject.Windows
    If ObjName($Window) = 'IWebBrowser2' Then
    If $Window.HWND = $WinHandle Then
    Return StringReplace(StringReplace(StringReplace($Window.LocationURL, 'file:///', ''), '/', '\'), '%20', ' ')
    EndIf
    EndIf
    Next

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

    Return SetError(2, 0, '')
    EndFunc

    [/autoit]


    Aber wie Progandy schon schrieb - es sollte auch ohne vorheriges Schließen klappen.

    Einmal editiert, zuletzt von AspirinJunkie (3. August 2009 um 13:56)


  • Aber wie Progandy schon schrieb - es sollte auch ohne vorheriges Schließen klappen.

    Hab es mal getestet, bei mir funktioniert es mit SHFileOperation:

    Spoiler anzeigen
    [autoit]

    Global Const $FO_MOVE = 0x0001
    Global Const $FO_COPY = 0x0002
    Global Const $FO_DELETE = 0x0003
    Global Const $FO_RENAME = 0x0004

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

    Global Const $FOF_MULTIDESTFILES = 0x0001
    Global Const $FOF_CONFIRMMOUSE = 0x0002
    Global Const $FOF_SILENT = 0x0004
    Global Const $FOF_RENAMEONCOLLISION = 0x0008
    Global Const $FOF_NOCONFIRMATION = 0x0010
    Global Const $FOF_WANTMAPPINGHANDLE = 0x0020
    Global Const $FOF_ALLOWUNDO = 0x0040
    Global Const $FOF_FILESONLY = 0x0080
    Global Const $FOF_SIMPLEPROGRESS = 0x0100
    Global Const $FOF_NOCONFIRMMKDIR = 0x0200
    Global Const $FOF_NOERRORUI = 0x0400
    Global Const $FOF_NOCOPYSECURITYATTRIBS = 0x0800
    Global Const $FOF_NORECURSION = 0x1000
    Global Const $FOF_NO_CONNECTED_ELEMENTS = 0x2000
    Global Const $FOF_WANTNUKEWARNING = 0x4000
    Global Const $FOF_NORECURSEREPARSE = 0x8000

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

    Global Const $tagSHFILEOPSTRUCT = "hwnd hWnd;uint wFunc;ptr pFrom;ptr pTo;int fFlags; int fAnyOperationsAborted;ptr hNameMappings;ptr lpszProgressTitle"

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

    Func _createStringArray($aStrings)
    ; Author: Prog@ndy
    If IsArray($aStrings) Then
    Local $structstring=""
    For $i = 0 To UBound($aStrings)-1
    $structstring &= "wchar[" & (StringLen($aStrings[$i])+1) & "];"
    Next
    $structstring &= "wchar;"
    Local $struct = DllStructCreate($structstring)
    For $i = 0 To UBound($aStrings)-1
    DllStructSetData($struct,$i+1,$aStrings[$i])
    Next
    Else
    Local $iSize = StringLen($aStrings)+2
    Local $struct = DllStructCreate("wchar[" & $iSize & "]")
    DllStructSetData($struct,1,$aStrings)
    EndIf
    Return $struct
    EndFunc

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

    Func _SHFileOperation(ByRef $SHFILEOPSTRUCT)
    ; Author: Prog@ndy
    Local $aDllRet = DllCall("shell32.dll", "int", "SHFileOperationW", "ptr", DllStructGetPtr($SHFILEOPSTRUCT))
    If @error Then Return SetError(1,0,0)
    Return SetError($aDllRet[0],0, $aDllRet[0]=0)
    EndFunc

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

    ;----------------------------------------------------------------------------------------

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

    ;#;#; VORBEREITEN
    $FileOP = DllStructCreate($tagSHFILEOPSTRUCT)
    $From = _createStringArray("C:\test\deleteme")
    DllStructSetData($FileOP, "pFrom", DllStructGetPtr($From))
    DllStructSetData($FileOP, "wFunc", $FO_DELETE)

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

    ; $FOF_NOCONFIRMATION -> keine Bestätigungen abfragen
    ; $FOF_SILENT -> keinen Fortschrittsbalekn anzeigen
    ; $FOF_NOERRORUI -> keine Fehler anzeigen
    ; $FOF_ALLOWUNDO -> in den Papierkorb
    ; DllStructSetData($FileOP, "fFlags", BitOR($FOF_NOCONFIRMATION, $FOF_SILENT, $FOF_NOERRORUI, $FOF_ALLOWUNDO) ) ; alle vier Einstellungen
    DllStructSetData($FileOP, "fFlags", BitOR($FOF_NOCONFIRMATION, $FOF_ALLOWUNDO)) ; nur Bestätigungen abschalten + Papierkorb

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

    ;#;#; AUSFÜHREN
    _SHFileOperation($FileOP)

    [/autoit]
  • Danke progandy Funktioniert wie ich es mir erhofft hatte

    Musste nur noch schau das kein Process im den Ordner statt findet aber das habe ich hinbekommen ;)

    Ich danke auch den anderen für ihre vorschläge :)