_GUICtrlTreeView_CreateDirectory (erstellt ein TreeView mit Verzeichnissen +Dateien)

    • Offizieller Beitrag

    Diese Funktion liest ein Verzeichnis rekursiv ein und stellt den Inhalt in einem TreeView dar.
    Man kann angeben, ob auch Dateien in das TreeView aufgenommen werden sollen (Achtung! Das dauert u.U. sehr lange).
    Die Funktion gibt (wenn erfolgreich) ein Array mit 2 Werten zurück ( [0] = Anzahl der Verzeichnisse, [1] = Anzahl der Dateien ).

    Screenshot:
    autoit.de/wcf/attachment/3644/


    Ausführliches Beispielscript ist dabei:

    Spoiler anzeigen
    [autoit]


    #include<GuiTreeView.au3> ; erforderlich

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

    ; Beispiel Anfang
    #include<EditConstants.au3>
    #include<GUIConstantsEx.au3>
    #include<TreeViewConstants.au3>
    #include<WindowsConstants.au3>

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

    Global $sPath = 'c:\programme\autoit3\'
    Global $width = 800, $height = 600
    Global $hGui = GUICreate('Directory-Treeview-Beispiel', $width, $height, -1, 0)
    Global $hInput = GUICtrlCreateInput($sPath, 10, 10, $width - 160, 20, BitOR($ES_AUTOHSCROLL, $ES_READONLY))
    Global $hChoose = GUICtrlCreateButton('...', $width - 148, 9, 30, 22)
    GUICtrlSetFont(-1, 9, 600, 0, 'Verdana')
    Global $hFiles = GUICtrlCreateCheckbox('inkl. Dateien', $width - 100, 10, 80, 16)
    Global $bFiles = False
    Global $hTreeView = GUICtrlCreateTreeView(10, 40, $width - 20, $height - 70, BitOR($GUI_SS_DEFAULT_TREEVIEW, $TVS_CHECKBOXES), $WS_EX_STATICEDGE)
    GUICtrlSetFont(-1, 10, 400, 0, 'Arial')
    GUICtrlSetBkColor(-1, 0xF8F8F8)
    Global $hContextMenu = GUICtrlCreateContextMenu($hTreeView)
    Global $hInfo = GUICtrlCreateMenuItem('Informationen', $hContextMenu)
    Global $hExpand = GUICtrlCreateMenuItem('alles auseinanderfalten', $hContextMenu)
    Global $hCollapse = GUICtrlCreateMenuItem('alles zusammenfalten', $hContextMenu)
    Global $hStatus1 = GUICtrlCreateLabel('', 0, $height - 16, $width / 2, 16, -1, $WS_EX_STATICEDGE)
    Global $hStatus2 = GUICtrlCreateLabel('', $width / 2 + 1, $height - 16, $width / 2, 16, -1, $WS_EX_STATICEDGE)
    GUISetState()

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

    _TreeViewUpdate()

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

    While True
    Switch GUIGetMsg()
    Case $hChoose
    $sTmp = FileSelectFolder('Verzeichnis auswählen', '', 0, $sPath, $hGui)
    If Not @error Then
    $sPath = $sTmp
    GUICtrlSetData($hInput, $sPath)
    _TreeViewUpdate()
    EndIf
    Case $hFiles
    $bFiles = BitAND(GUICtrlRead($hFiles), $GUI_CHECKED) = $GUI_CHECKED
    _TreeViewUpdate()
    Case $GUI_EVENT_PRIMARYDOWN
    $aInfo = GUIGetCursorInfo($hGui)
    If $aInfo[4] = $hTreeView Then
    $oldGUIDataSeparatorChar = Opt('GUIDataSeparatorChar', '\')
    GUICtrlSetData($hStatus1, ' ' & StringReplace(_GUICtrlTreeView_GetTree($hTreeView), '\\', '\'))
    Opt('GUIDataSeparatorChar', $oldGUIDataSeparatorChar)
    If BitAND(_GUICtrlTreeView_HitTest($hTreeView, $aInfo[0] - 11, $aInfo[1] - 41), 64) Then
    $checked = _GUICtrlTreeView_GetChecked($hTreeView, _GUICtrlTreeView_GetSelection($hTreeView))
    _GUICtrlTreeView_SetBold($hTreeView, _GUICtrlTreeView_GetSelection($hTreeView), $checked)
    $hItem = _GUICtrlTreeView_GetFirstChild($hTreeView, _GUICtrlTreeView_GetSelection($hTreeView))
    If $hItem Then _MarkChildItems($hTreeView, $hItem, $checked)
    EndIf
    EndIf
    Case $hInfo
    $oldGUIDataSeparatorChar = Opt('GUIDataSeparatorChar', '\')
    $TempPath = StringReplace(_GUICtrlTreeView_GetTree($hTreeView), '\\', '\')
    Opt('GUIDataSeparatorChar', $oldGUIDataSeparatorChar)
    MsgBox(0, 'Informationen', $TempPath & @CRLF & 'Dateigröße: ' & FileGetSize($TempPath) & ' Bytes')
    Case $hExpand
    _ExpandAll($hTreeView)
    Case $hCollapse
    _CollapseAll($hTreeView)
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

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

    Func _MarkChildItems(ByRef $hTreeView, $hItem, $checked)
    Do
    $hNewItem = _GUICtrlTreeView_GetFirstChild($hTreeView, $hItem)
    If $hNewItem Then _MarkChildItems($hTreeView, $hNewItem, $checked)
    _GUICtrlTreeView_SetChecked($hTreeView, $hItem, $checked)
    _GUICtrlTreeView_SetBold($hTreeView, $hItem, $checked)
    $hItem = _GUICtrlTreeView_GetNextChild($hTreeView, $hItem)
    Until $hItem = 0
    EndFunc ;==>_MarkChildItems

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

    Func _ExpandAll($hTreeView)
    _GUICtrlTreeView_Expand($hTreeView)
    EndFunc ;==>_ExpandAll

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

    Func _CollapseAll($hTreeView)
    _GUICtrlTreeView_Expand($hTreeView, 0, False)
    EndFunc ;==>_CollapseAll

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

    Func _TreeViewUpdate()
    GUICtrlSetData($hStatus1, ' Bitte warten! Verzeichnis wird eingelesen...')
    GUICtrlSetData($hStatus2, '')
    $Timer = TimerInit()
    Local $aCount = _GUICtrlTreeView_CreateDirectory($hTreeView, $sPath, $bFiles)
    If Not @error Then
    $msg = ' Benötigte Zeit: ' & Round(TimerDiff($Timer) / 1000, 3) & ' sek.'
    $msg &= ' | ' & $aCount[1] & ' Datei(en) und ' & $aCount[0] & ' Verzeichniss(e)'
    GUICtrlSetData($hStatus1, ' Fertig.')
    GUICtrlSetData($hStatus2, $msg)
    EndIf
    EndFunc ;==>_TreeViewUpdate
    ; Beispiel Ende

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

    ;===============================================================================
    ; Function Name: _GUICtrlTreeView_CreateDirectory($hTreeView, $sPath, $bFiles)
    ; Description:: erstellt ein TreeView mit Verzeichnissen (+Dateien)
    ; Parameter(s): $hTreeView = ControlID/Handle des TreeViews
    ; $sPath = Verzeichnispfad, der dargestellt werden soll
    ; $bFiles = True = auch Dateien anzeigen, False = nur Verzeichnisse
    ; Requirement(s): #include<GuiTreeView.au3>
    ; Return Value(s): Array mit Anzahl der Verzeichnisse=[0] und Dateien=[1]
    ; 0 und @error = 1, wenn der Pfad nicht existiert bzw. kein Verzeichnis ist
    ; 0 und @error = 2, wenn das FileSystemObject nicht erstellt werden konnte
    ; Author(s): Oscar (http://www.autoit.de)
    ;===============================================================================
    Func _GUICtrlTreeView_CreateDirectory($hTreeView, $sPath, $bFiles = False)
    Local $hFileItem, $FolderColor = 0x0000FF, $Folder, $aCount[2] = [0, 0]
    If Not StringInStr(FileGetAttrib($sPath), 'D') Then Return SetError(1, 0, 0)
    $sPath = FileGetLongName($sPath)
    Local $oFSO = ObjCreate('Scripting.FileSystemObject')
    If @error Then Return SetError(2, 0, 0)
    _GUICtrlTreeView_BeginUpdate($hTreeView)
    _GUICtrlTreeView_DeleteAll(GUICtrlGetHandle($hTreeView))
    Local $hTreeViewItem = GUICtrlCreateTreeViewItem($sPath, $hTreeView)
    GUICtrlSetColor(-1, $FolderColor)
    _GUICtrlTreeView_SetIcon($hTreeView, $hTreeViewItem, 'shell32.dll', 0)
    $Folder = $oFSO.GetFolder($sPath)
    _CreateDirectoryRecursive($hTreeView, $Folder, $hTreeViewItem, $bFiles, $aCount)
    If $bFiles Then
    For $Files In $Folder.Files
    $hFileItem = GUICtrlCreateTreeViewItem($Files.Name, $hTreeViewItem)
    $aCount[1] += 1
    Next
    EndIf
    _GUICtrlTreeView_SetIcon($hTreeView, $hTreeViewItem, 'shell32.dll', 3, 2)
    _GUICtrlTreeView_SetIcon($hTreeView, $hTreeViewItem, 'shell32.dll', 110, 4)
    _GUICtrlTreeView_EndUpdate($hTreeView)
    GUICtrlSetState($hTreeViewItem, $GUI_EXPAND)
    $oFSO = ''
    Return $aCount
    EndFunc ;==>_GUICtrlTreeView_CreateDirectory

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

    Func _CreateDirectoryRecursive($hTreeView, $Folder, $ItemOld, $bFiles, ByRef $aCount)
    Local $hFolderItem, $hFileItem, $FolderColor = 0x0000FF
    For $Subfolder In $Folder.SubFolders
    $hFolderItem = GUICtrlCreateTreeViewItem($Subfolder.Name, $ItemOld)
    GUICtrlSetColor(-1, $FolderColor)
    _GUICtrlTreeView_SetIcon($hTreeView, $hFolderItem, 'shell32.dll', 3, 2)
    _GUICtrlTreeView_SetIcon($hTreeView, $hFolderItem, 'shell32.dll', 110, 4)
    $aCount[0] += 1
    _CreateDirectoryRecursive($hTreeView, $Subfolder, $hFolderItem, $bFiles, $aCount)
    If $bFiles Then
    For $Files In $Subfolder.Files
    $hFileItem = GUICtrlCreateTreeViewItem($Files.Name, $hFolderItem)
    $aCount[1] += 1
    Next
    EndIf
    Next
    EndFunc ;==>_CreateDirectoryRecursive

    [/autoit]

    Edit ( 06.01.09 :( Ich habe jetzt herausgefunden, dass die Icons an die Child-Items "vererbt" werden, wenn man nicht explizit ein Icon angibt. Das habe ich mir zunutze gemacht und weise dem ersten Verzeichnis zuerst das Datei-Icon zu, was dann an alle Childs vererbt wird. Den Unterverzeichnissen weise ich dann jeweils das Verzeichnis-Icon zu (dauert nicht so lange) und am Schluß ändere ich das Icon vom ersten Verzeichnis auf das Verzeichnis-Icon. So spare ich mir die Zuweisung bei den Dateien, was ja sonst sehr lange gedauert hat.
    Jetzt dauert das Beispielscript (mit Dateien anhaken) bei mir nur noch 1,3 Sek. statt vorher 9,5 Sek. :)

    • Offizieller Beitrag

    Cooles Script Oscar :thumbup: . Hab noch einen Vorschlag zum Erweitern. Wenn die Checkbox incl. Dateien angeklickt wird ,sollte sich die Anzeige dementsprechend anpassen. Oder eventuell einen Button für das neueinlesen hinzufügen. Sonst ist das Teil Super :thumbup:

  • Hallo Oscar & User/innen.

    Die letzte Antwort auf das Script liegt zwar schon längere Zeit (112 Tage) zurück, aber ich frage mich folgendes.

    Wenn ich einige Dateien /Ordner makiert habe, wie mache ich es, das ich im Script sage, das er sie mir dann z. B. nach e:\ kopieren soll?

    Ich finde die Stelle nicht.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

    • Offizieller Beitrag

    Dazu sind dann schon noch einige Anpassungen nötig.
    Ich hatte aber gerade Lust dazu und so habe ich daraus mal ein "CopyTool" entwickelt:

    Screenshot:
    autoit.de/wcf/attachment/4594/

    Script:

    Spoiler anzeigen
    [autoit]


    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <TreeViewConstants.au3>
    #include <WindowsConstants.au3>
    #include <GuiTreeView.au3>

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

    Global $sPath = @ScriptDir
    Global $width = 800, $height = 600
    Global $hGui = GUICreate('CopyTool', $width, $height, -1, 0)
    Global $hInput = GUICtrlCreateInput($sPath, 10, 10, $width - 160, 20, BitOR($ES_AUTOHSCROLL, $ES_READONLY))
    Global $hChoose = GUICtrlCreateButton('...', $width - 148, 9, 30, 22)
    GUICtrlSetFont(-1, 9, 600, 0, 'Verdana')
    Global $hFiles = GUICtrlCreateCheckbox('zeige Dateien', $width - 100, 14, 80, 16)
    Global $bFiles = False
    Global $hTreeView = GUICtrlCreateTreeView(10, 40, $width - 20, $height - 110, BitOR($GUI_SS_DEFAULT_TREEVIEW, $TVS_CHECKBOXES), $WS_EX_STATICEDGE)
    GUICtrlSetFont(-1, 10, 400, 0, 'Arial')
    GUICtrlSetBkColor(-1, 0xF8F8F8)
    Global $hContextMenu = GUICtrlCreateContextMenu($hTreeView)
    Global $hInfo = GUICtrlCreateMenuItem('Informationen', $hContextMenu)
    Global $hExpand = GUICtrlCreateMenuItem('alles auseinanderfalten', $hContextMenu)
    Global $hCollapse = GUICtrlCreateMenuItem('alles zusammenfalten', $hContextMenu)
    Global $hCopy = GUICtrlCreateButton('markierte Dateien/Verzeichnisse kopieren...', 10, $height - 60, 240, 25)
    Global $hStatus1 = GUICtrlCreateLabel('', 0, $height - 16, $width / 2, 16, -1, $WS_EX_STATICEDGE)
    Global $hStatus2 = GUICtrlCreateLabel('', $width / 2 + 1, $height - 16, $width / 2, 16, -1, $WS_EX_STATICEDGE)
    GUISetState()

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

    _TreeViewUpdate($hTreeView)

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

    While True
    Switch GUIGetMsg()
    Case $hChoose
    $sTmp = FileSelectFolder('Verzeichnis auswählen', '', 0, $sPath, $hGui)
    If Not @error Then
    $sPath = $sTmp
    GUICtrlSetData($hInput, $sPath)
    _TreeViewUpdate($hTreeView)
    EndIf
    Case $hFiles
    $bFiles = BitAND(GUICtrlRead($hFiles), $GUI_CHECKED) = $GUI_CHECKED
    _TreeViewUpdate($hTreeView)
    Case $GUI_EVENT_PRIMARYDOWN
    $aInfo = GUIGetCursorInfo($hGui)
    If $aInfo[4] = $hTreeView Then
    $oldGUIDataSeparatorChar = Opt('GUIDataSeparatorChar', '\')
    GUICtrlSetData($hStatus1, ' ' & StringReplace(_GUICtrlTreeView_GetTree($hTreeView), '\\', '\'))
    Opt('GUIDataSeparatorChar', $oldGUIDataSeparatorChar)
    If BitAND(_GUICtrlTreeView_HitTest($hTreeView, $aInfo[0] - 11, $aInfo[1] - 41), 64) Then
    $checked = _GUICtrlTreeView_GetChecked($hTreeView, _GUICtrlTreeView_GetSelection($hTreeView))
    $hItem = _GUICtrlTreeView_GetFirstChild($hTreeView, _GUICtrlTreeView_GetSelection($hTreeView))
    If $hItem And $checked Then _SetChildItemsUnChecked($hTreeView, $hItem)
    If $checked Then
    $hParent = _GUICtrlTreeView_GetParentHandle($hTreeView, _GUICtrlTreeView_GetSelection($hTreeView))
    If $hParent Then _SetParentItemsUnchecked($hTreeView, $hParent)
    EndIf
    EndIf
    EndIf
    Case $hInfo
    $oldGUIDataSeparatorChar = Opt('GUIDataSeparatorChar', '\')
    $TempPath = StringReplace(_GUICtrlTreeView_GetTree($hTreeView), '\\', '\')
    Opt('GUIDataSeparatorChar', $oldGUIDataSeparatorChar)
    MsgBox(0, 'Informationen', $TempPath & @CRLF & 'Dateigröße: ' & FileGetSize($TempPath) & ' Bytes')
    Case $hExpand
    _ExpandAll($hTreeView)
    Case $hCollapse
    _CollapseAll($hTreeView)
    Case $hCopy
    Global $aItems[_GUICtrlTreeView_GetCount($hTreeView) - 1]
    Global $iCheckedCount = 0
    $oldGUIDataSeparatorChar = Opt('GUIDataSeparatorChar', '\')
    _CheckedItemsToArray($hTreeView)
    $sDestDir = FileSelectFolder('Zielverzeichnis auswählen!', '', 3, '', $hGui)
    If Not @error Then
    GUICtrlSetData($hStatus1, ' Bitte warten! Dateien/Verzeichnisse werden kopiert...')
    For $i = 0 To $iCheckedCount - 1
    If StringInStr(FileGetAttrib($aItems[$i]), 'D') Then
    $sDir = StringRegExpReplace($aItems[$i], '.*(\\.*)', '$1')
    GUICtrlSetData($hStatus1, ' Kopiere: ' & $aItems[$i] & ' --> ' & $sDestDir & $sDir)
    DirCopy($aItems[$i], $sDestDir & $sDir, 1)
    Else
    GUICtrlSetData($hStatus1, ' Kopiere: ' & $aItems[$i] & ' --> ' & $sDestDir)
    FileCopy($aItems[$i], $sDestDir, 9)
    EndIf
    Next
    GUICtrlSetData($hStatus1, ' Fertig.')
    EndIf
    Opt('GUIDataSeparatorChar', $oldGUIDataSeparatorChar)
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

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

    Func _CheckedItemsToArray(ByRef $hTreeView)
    Local $hFirstItem = _GUICtrlTreeView_GetFirstChild($hTreeView, 1)
    _ReadChildItems($hTreeView, $hFirstItem)
    If $iCheckedCount = 0 Then Return
    ReDim $aItems[$iCheckedCount]
    EndFunc ;==>_CheckedItemsToArray

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

    Func _ReadChildItems(ByRef $hTreeView, $hItem)
    Do
    $hNewItem = _GUICtrlTreeView_GetFirstChild($hTreeView, $hItem)
    If $hNewItem Then _ReadChildItems($hTreeView, $hNewItem)
    If _GUICtrlTreeView_GetChecked($hTreeView, $hItem) Then
    $aItems[$iCheckedCount] = StringReplace(_GUICtrlTreeView_GetTree($hTreeView, $hItem), '\\', '\')
    $iCheckedCount += 1
    EndIf
    $hItem = _GUICtrlTreeView_GetNextChild($hTreeView, $hItem)
    Until $hItem = 0
    EndFunc ;==>_ReadChildItems

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

    Func _SetParentItemsUnchecked(ByRef $hTreeView, $hItem)
    Local $hParent = _GUICtrlTreeView_GetParentHandle($hTreeView, $hItem)
    If $hParent Then _SetParentItemsUnchecked($hTreeView, $hParent)
    _GUICtrlTreeView_SetChecked($hTreeView, $hItem, False)
    EndFunc ;==>_SetParentItemsUnchecked

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

    Func _SetChildItemsUnChecked(ByRef $hTreeView, $hItem)
    Do
    $hNewItem = _GUICtrlTreeView_GetFirstChild($hTreeView, $hItem)
    If $hNewItem Then _SetChildItemsUnChecked($hTreeView, $hNewItem)
    _GUICtrlTreeView_SetChecked($hTreeView, $hItem, False)
    $hItem = _GUICtrlTreeView_GetNextChild($hTreeView, $hItem)
    Until $hItem = 0
    EndFunc ;==>_SetChildItemsUnChecked

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

    Func _ExpandAll(ByRef $hTreeView)
    _GUICtrlTreeView_Expand($hTreeView)
    EndFunc ;==>_ExpandAll

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

    Func _CollapseAll(ByRef $hTreeView)
    _GUICtrlTreeView_Expand($hTreeView, 0, False)
    EndFunc ;==>_CollapseAll

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

    Func _TreeViewUpdate(ByRef $hTreeView)
    GUICtrlSetData($hStatus1, ' Bitte warten! Verzeichnis wird eingelesen...')
    GUICtrlSetData($hStatus2, '')
    $Timer = TimerInit()
    Local $aCount = _GUICtrlTreeView_CreateDirectory($hTreeView, $sPath, $bFiles)
    If Not @error Then
    $msg = ' Benötigte Zeit: ' & Round(TimerDiff($Timer) / 1000, 3) & ' sek.'
    $msg &= ' | ' & $aCount[1] & ' Datei(en) und ' & $aCount[0] & ' Verzeichniss(e)'
    GUICtrlSetData($hStatus2, $msg)
    EndIf
    GUICtrlSetData($hStatus1, ' Fertig.')
    EndFunc ;==>_TreeViewUpdate
    ; Beispiel Ende

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

    ;===============================================================================
    ; Function Name: _GUICtrlTreeView_CreateDirectory($hTreeView, $sPath, $bFiles)
    ; Description:: erstellt ein TreeView mit Verzeichnissen (+Dateien)
    ; Parameter(s): $hTreeView = ControlID/Handle des TreeViews
    ; $sPath = Verzeichnispfad, der dargestellt werden soll
    ; $bFiles = True = auch Dateien anzeigen, False = nur Verzeichnisse
    ; Requirement(s): #include <GuiTreeView.au3>
    ; Return Value(s): Array mit Anzahl der Verzeichnisse=[0] und Dateien=[1]
    ; 0 und @error = 1, wenn der Pfad nicht existiert bzw. kein Verzeichnis ist
    ; 0 und @error = 2, wenn das FileSystemObject nicht erstellt werden konnte
    ; Author(s): Oscar (http://www.autoit.de)
    ;===============================================================================
    Func _GUICtrlTreeView_CreateDirectory($hTreeView, $sPath, $bFiles = False)
    Local $hFileItem, $FolderColor = 0x0000FF, $Folder, $aCount[2] = [0, 0]
    If Not StringInStr(FileGetAttrib($sPath), 'D') Then Return SetError(1, 0, 0)
    $sPath = FileGetLongName($sPath)
    Local $oFSO = ObjCreate('Scripting.FileSystemObject')
    If @error Then Return SetError(2, 0, 0)
    _GUICtrlTreeView_BeginUpdate($hTreeView)
    _GUICtrlTreeView_DeleteAll(GUICtrlGetHandle($hTreeView))
    Local $hTreeViewItem = GUICtrlCreateTreeViewItem($sPath, $hTreeView)
    GUICtrlSetColor(-1, $FolderColor)
    _GUICtrlTreeView_SetIcon($hTreeView, $hTreeViewItem, 'shell32.dll', 0)
    $Folder = $oFSO.GetFolder($sPath)
    _CreateDirectoryRecursive($hTreeView, $Folder, $hTreeViewItem, $bFiles, $aCount)
    If $bFiles Then
    For $Files In $Folder.Files
    $hFileItem = GUICtrlCreateTreeViewItem($Files.Name, $hTreeViewItem)
    $aCount[1] += 1
    Next
    EndIf
    _GUICtrlTreeView_SetIcon($hTreeView, $hTreeViewItem, 'shell32.dll', 3, 2)
    _GUICtrlTreeView_SetIcon($hTreeView, $hTreeViewItem, 'shell32.dll', 110, 4)
    _GUICtrlTreeView_EndUpdate($hTreeView)
    GUICtrlSetState($hTreeViewItem, $GUI_EXPAND)
    $oFSO = ''
    Return $aCount
    EndFunc ;==>_GUICtrlTreeView_CreateDirectory

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

    Func _CreateDirectoryRecursive($hTreeView, $Folder, $ItemOld, $bFiles, ByRef $aCount)
    Local $hFolderItem, $hFileItem, $FolderColor = 0x0000FF
    For $Subfolder In $Folder.SubFolders
    $hFolderItem = GUICtrlCreateTreeViewItem($Subfolder.Name, $ItemOld)
    GUICtrlSetColor(-1, $FolderColor)
    _GUICtrlTreeView_SetIcon($hTreeView, $hFolderItem, 'shell32.dll', 3, 2)
    _GUICtrlTreeView_SetIcon($hTreeView, $hFolderItem, 'shell32.dll', 110, 4)
    $aCount[0] += 1
    _CreateDirectoryRecursive($hTreeView, $Subfolder, $hFolderItem, $bFiles, $aCount)
    If $bFiles Then
    For $Files In $Subfolder.Files
    $hFileItem = GUICtrlCreateTreeViewItem($Files.Name, $hFolderItem)
    $aCount[1] += 1
    Next
    EndIf
    Next
    EndFunc ;==>_CreateDirectoryRecursive

    [/autoit]

    Edit: Fehler beseitigt!

  • OSCAR
    Super, dann kann ich ja mal vergleichen.
    Version 1 zu Version 2.

    DANKE !!!

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

  • Bei mir zeigen beide Scripte einen kleinen Schönheitsfehler:

    Nach dem Start steht im Verzeichnis-Input-Feld "C:\Programme\Autoit" und in der Statuszeile erscheint "Bitte warten! Verzeichnis wird eingelesen..."

    Nur tun, tut er nichts !

    Wähle ich den Ordner nochmal per Hand, das ist, schwups die wups, der Inhalt da. Wenn das Script also nach dem Start "nix" tut, sollte besser auch die Eingabezeile leer bleiben und der Status passen. Der eine oder andere wartet sonst nächstes Jahr noch.

    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"

    2 Mal editiert, zuletzt von Micha_he (30. April 2009 um 10:33)

  • Bei mir zeigen beide Scripte einen kleinen Schönheitsfehler:

    Nach dem Start steht im Verzeichnis-Input-Feld "C:\Programme\Autoit" und in der Statuszeile erscheint "Bitte warten! Verzeichnis wird eingelesen..."

    Nur tun, tut er nichts !

    Wähle ich den Ordner nochmal per Hand, das ist, schwups die wups, der Inhalt da. Wenn das Script also nach dem Start "nix" tut, sollte besser auch die Eingabezeile leer bleiben und der Status passen. Der eine oder andere wartet sonst nächstes Jahr noch.

    Kann ich NICHT BESTÄTIGEN, denn bei mir braucht das Script 4,7 Sec. bis alles durchgelaufen und angezeigt ist.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    k3mrwmIBHejryPvylQSFieDF5f3VOnk6iLAVBGVhKQegrFuWr3iraNIblLweSW4WgqI0SrRbS7U5jI3sn50R4a15Cthu1bEr

    • Offizieller Beitrag

    Hier ist noch ein Beispiel-Skript (Funktion etwas geändert), mit der man einen Eintrag für das Parent-Directory bekommt (falls vorhanden).
    Ein Mausklick auf den Eintrag "..\" und das Treeview wird mit dem Parent-Directory neu erstellt.

    Spoiler anzeigen
    [autoit]


    #include <WindowsConstants.au3>
    #include <GuiTreeView.au3>
    #include <GUIConstantsEx.au3>
    $hGui = GUICreate('SelectFolder', 800, 600)
    $hTreeView = GUICtrlCreateTreeView(10, 10, 380, 580, Default, $WS_EX_STATICEDGE)
    GUISetState()
    $sPath = @UserProfileDir
    If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
    ToolTip('Please wait...', @DesktopWidth/2-280, @DesktopHeight/2)
    _GUICtrlTreeView_CreateDirectory($hTreeView, $sPath)
    ToolTip('')

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

    While True
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $GUI_EVENT_PRIMARYUP
    $aInfo = GUIGetCursorInfo($hGui)
    If $aInfo[4] = $hTreeView Then
    $sItem = ControlTreeView($hGui, '', $hTreeView, 'GetSelected')
    If $sItem = '..\' Then
    $sPath = StringRegExpReplace($sPath, '(.+\\).+\\', '$1')
    ToolTip('Please wait...', @DesktopWidth/2-280, @DesktopHeight/2)
    _GUICtrlTreeView_DeleteAll($hTreeView)
    _GUICtrlTreeView_CreateDirectory($hTreeView, $sPath)
    ToolTip('')
    EndIf
    EndIf
    EndSwitch
    WEnd

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

    ;===============================================================================
    ; Function Name: _GUICtrlTreeView_CreateDirectory($hTreeView, $sPath, $bFiles)
    ; Description:: erstellt ein TreeView mit Verzeichnissen (+Dateien)
    ; Parameter(s): $hTreeView = ControlID/Handle des TreeViews
    ; $sPath = Verzeichnispfad, der dargestellt werden soll
    ; $bFiles = True = auch Dateien anzeigen, False = nur Verzeichnisse
    ; Requirement(s): #include <GuiTreeView.au3>
    ; Return Value(s): Array mit Anzahl der Verzeichnisse=[0] und Dateien=[1]
    ; 0 und @error = 1, wenn der Pfad nicht existiert bzw. kein Verzeichnis ist
    ; 0 und @error = 2, wenn das FileSystemObject nicht erstellt werden konnte
    ; Author(s): Oscar (http://www.autoit.de)
    ;===============================================================================
    Func _GUICtrlTreeView_CreateDirectory($hTreeView, $sPath, $bFiles = False)
    Local $hFileItem, $FolderColor = 0x0000FF, $Folder, $aCount[2] = [0, 0]
    If Not StringInStr(FileGetAttrib($sPath), 'D') Then Return SetError(1, 0, 0)
    $sPath = FileGetLongName($sPath)
    If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
    Local $oFSO = ObjCreate('Scripting.FileSystemObject')
    If @error Then Return SetError(2, 0, 0)
    _GUICtrlTreeView_BeginUpdate($hTreeView)
    _GUICtrlTreeView_DeleteAll(GUICtrlGetHandle($hTreeView))
    Local $aTmp = StringSplit($sPath, '\'), $hParent = $hTreeView
    If $aTmp[0] > 2 Then
    $hParent = GUICtrlCreateTreeViewItem('..\', $hTreeView)
    GUICtrlSetColor(-1, $FolderColor)
    _GUICtrlTreeView_SetIcon($hTreeView, $hParent, 'shell32.dll', 0)
    EndIf
    Local $hTreeViewItem = GUICtrlCreateTreeViewItem($sPath, $hParent)
    GUICtrlSetColor(-1, $FolderColor)
    _GUICtrlTreeView_SetIcon($hTreeView, $hTreeViewItem, 'shell32.dll', 0)
    $Folder = $oFSO.GetFolder($sPath)
    _CreateDirectoryRecursive($hTreeView, $Folder, $hTreeViewItem, $bFiles, $aCount)
    If $bFiles Then
    For $Files In $Folder.Files
    $hFileItem = GUICtrlCreateTreeViewItem($Files.Name, $hTreeViewItem)
    $aCount[1] += 1
    Next
    EndIf
    _GUICtrlTreeView_SetIcon($hTreeView, $hTreeViewItem, 'shell32.dll', 3, 2)
    _GUICtrlTreeView_SetIcon($hTreeView, $hTreeViewItem, 'shell32.dll', 110, 4)
    _GUICtrlTreeView_EndUpdate($hTreeView)
    If $aTmp[0] > 1 Then
    _GUICtrlTreeView_SetIcon($hTreeView, $hParent, 'shell32.dll', 3, 2)
    _GUICtrlTreeView_SetIcon($hTreeView, $hParent, 'shell32.dll', 110, 4)
    GUICtrlSetState($hParent, $GUI_EXPAND)
    EndIf
    GUICtrlSetState($hTreeViewItem, $GUI_EXPAND)
    $oFSO = ''
    Return $aCount
    EndFunc ;==>_GUICtrlTreeView_CreateDirectory

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

    Func _CreateDirectoryRecursive($hTreeView, $Folder, $ItemOld, $bFiles, ByRef $aCount)
    Local $hFolderItem, $hFileItem, $FolderColor = 0x0000FF
    For $Subfolder In $Folder.SubFolders
    $hFolderItem = GUICtrlCreateTreeViewItem($Subfolder.Name, $ItemOld)
    GUICtrlSetColor(-1, $FolderColor)
    _GUICtrlTreeView_SetIcon($hTreeView, $hFolderItem, 'shell32.dll', 3, 2)
    _GUICtrlTreeView_SetIcon($hTreeView, $hFolderItem, 'shell32.dll', 110, 4)
    $aCount[0] += 1
    _CreateDirectoryRecursive($hTreeView, $Subfolder, $hFolderItem, $bFiles, $aCount)
    If $bFiles Then
    For $Files In $Subfolder.Files
    $hFileItem = GUICtrlCreateTreeViewItem($Files.Name, $hFolderItem)
    $aCount[1] += 1
    Next
    EndIf
    Next
    EndFunc ;==>_CreateDirectoryRecursive

    [/autoit]
  • Servus Oscar,

    kannst Du mir mitgeben welche AuotIT Version für das Copy-Tool wie das TreeView-Dir-Viewer genutzt hast?

    Da ich eine ältere nutze (3.2.4.9), laufen die diverse Beispielskripte nicht, da div. Custom Functions nicht vorhanden sind, wie z.B. _GUICtrlTreeView_HitTest, ControlTreeView, _GUICtrlTreeView_GetTree, usw.

    Dankeee :)

    Sppedy