Treeview in string/datei speichern

  • Hallo zusammen,

    also ich würde gerne mit einem GUI und einem treeview die komplette festplatte anzeigen lassen. Kann mir jemand zeigen wie das geht? außerdem möchte ich den treeview dann in einer datei speichern um später das ganze nochmal aufrufen zu können wie es zu diesem zeitpunkt war.
    kann mir bitte jemand helfen?

    • Offizieller Beitrag

    Er will ja ein TreeView. Da wäre das hier angebrachter:

    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 = @ProgramFilesDir
    Global $width = 800, $height = 600
    Global $hGui = GUICreate('Directory-Treeview-Beispiel', $width, $height, -1, 10)
    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 $hIcons = GUICtrlCreateCheckbox('inkl. Dateien', $width - 100, 10, 80, 20)
    Global $bIcons = 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 $hIcons
    $bIcons = BitAND(GUICtrlRead($hIcons), $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, True, $bIcons)
    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, $bIcons, $bFiles)
    ; Description:: erstellt ein TreeView mit Verzeichnissen (+Dateien)
    ; Parameter(s): $hTreeView = ControlID/Handle des TreeViews
    ; $sPath = Verzeichnispfad, der dargestellt werden soll
    ; $bIcons = True = Icons werden angezeigt, False = keine Icons
    ; $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, $bIcons = False, $bFiles = False)
    Local $hFileItem, $FolderColor = 0x0000FF, $aCount[2] = [0, 0]
    Local $hSearch, $hFile, $hTreeViewItem
    If Not StringInStr(FileGetAttrib($sPath), 'D') Then Return SetError(1, 0, 0)
    $sPath = FileGetLongName($sPath)
    If StringRight($sPath, 1) <> '\' Then $sPath &= '\'
    $hSearch = FileFindFirstFile($sPath & '*.*')
    If @error Then Return SetError(2, 0, 0)
    _GUICtrlTreeView_BeginUpdate($hTreeView)
    _GUICtrlTreeView_DeleteAll(GUICtrlGetHandle($hTreeView))
    $hTreeViewItem = GUICtrlCreateTreeViewItem($sPath, $hTreeView)
    GUICtrlSetColor(-1, $FolderColor)
    If $bIcons Then
    _GUICtrlTreeView_SetIcon($hTreeView, $hTreeViewItem, 'shell32.dll', 3, 2)
    _GUICtrlTreeView_SetIcon($hTreeView, $hTreeViewItem, 'shell32.dll', 110, 4)
    EndIf
    While True
    $hFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    If StringInStr(FileGetAttrib($sPath & $hFile), 'D') Then
    _CreateDirectoryRecursive($sPath & $hFile & '\', $hTreeViewItem, $bIcons, $bFiles, $aCount)
    ElseIf $bFiles Then
    $hFileItem = GUICtrlCreateTreeViewItem($hFile, $hTreeViewItem)
    $aCount[1] += 1
    If $bIcons Then _GUICtrlTreeView_SetIcon($hTreeView, $hFileItem, 'shell32.dll', 0)
    EndIf
    WEnd
    _GUICtrlTreeView_EndUpdate($hTreeView)
    FileClose($hSearch)
    GUICtrlSetState($hTreeViewItem, $GUI_EXPAND)
    $oFSO = ''
    Return $aCount
    EndFunc ;==>_GUICtrlTreeView_CreateDirectory

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

    Func _CreateDirectoryRecursive($sPath, $ItemOld, $bIcons, $bFiles, ByRef $aCount)
    Local $hFolderItem, $hFileItem, $FolderColor = 0x0000FF
    Local $hSearch, $hFile, $hTreeViewItem, $sTmp
    $sTmp = StringTrimRight(StringMid($sPath, StringInStr($sPath, '\', 0, -2) + 1), 1)
    $hFolderItem = GUICtrlCreateTreeViewItem($sTmp, $ItemOld)
    GUICtrlSetColor(-1, $FolderColor)
    If $bIcons Then
    _GUICtrlTreeView_SetIcon($hTreeView, $hFolderItem, 'shell32.dll', 3, 2)
    _GUICtrlTreeView_SetIcon($hTreeView, $hFolderItem, 'shell32.dll', 110, 4)
    EndIf
    $aCount[0] += 1
    $hSearch = FileFindFirstFile($sPath & '*.*')
    If @error Then Return
    While True
    $hFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    If StringInStr(FileGetAttrib($sPath & $hFile), 'D') Then
    _CreateDirectoryRecursive($sPath & $hFile & '\', $hFolderItem, $bIcons, $bFiles, $aCount)
    ElseIf $bFiles Then
    $hFileItem = GUICtrlCreateTreeViewItem($hFile, $hFolderItem)
    $aCount[1] += 1
    If $bIcons Then _GUICtrlTreeView_SetIcon($hTreeView, $hFileItem, 'shell32.dll', 0)
    EndIf
    WEnd
    FileClose($hSearch)
    EndFunc ;==>_CreateDirectoryRecursive

    [/autoit]


    Musst Du nur noch das TreeView Eintrag für Eintrag (rekursiv) durchlaufen und abspeichern.