tarretarretarre Posted February 6, 2016 Share Posted February 6, 2016 So I am trying to create a file tree structure Using _FileListToArrayRec with GuiCtrlCreateTreeView. But i have some problems with levels of directorys. In my mind there is nothing wrong with my logic, but obviously it is, since i dont get the output i want Here is a printscreen of the outcome, the array is sorted so it feels like it should be pretty easy, but its not Here is the working code expandcollapse popup#include <File.au3> #include <Array.au3> #include <GUITreeview.au3> #include <WINapiSHELLEX.au3> Local $hGI = GUICreate("test", 500,500) Local $hTreeView = GUICtrlCreateTreeView(0,0,500,500) GUISetState() Local $arr = _GuictrlTreeview__FileListToArrayRec($hTreeView,"C:\Autoit\REMOVE", "*.au3||BackUp;.git*;___TrashCan") _ArrayDisplay($arr) Func _GuictrlTreeview__FileListToArrayRec($hTreeView, $sPath, $sFilter) if StringRight($sPath,1) == "\" Then $sPath = StringLeft($sPath, StringLen($sPath) - 1) if not FileExists($sPath) Then Return SetError(1,0,0) Local $aFileList = _FileListToArrayRec($sPath, $sFilter, $FLTAR_FILESFOLDERS, $FLTAR_RECUR, $FLTAR_SORT, $FLTAR_FULLPATH) if @error Then Return SetError(1,0,0) Local $aParents[1] = [0] Local $sLastParentDirectory = False Local $hLastParentTreeItem = False Local $hLastParentChildItem = False ; Set default icons (late rreplaced with file associated icon $hImageList = _GUIImageList_Create(16, 16, 5, 1) _GUICtrlTreeView_SetNormalImageList($hTreeView, $hImageList) ; Begin tree update _GUICtrlTreeView_BeginUpdate($hTreeView) For $i = 1 To $aFileList[0] Local $sCurFullFilePath = $aFileList[$i] Local $sCurFileName = _Misc_GetFileName($aFileList[$i], False) ;Get da icon Local $hIcon = _WinAPI_ShellExtractAssociatedIcon($sCurFullFilePath, 1) Local $hIcon_Index = _GUIImageList_ReplaceIcon($hImageList, -1, $hIcon) ;If directory If FileGetAttrib($sCurFullFilePath) == "D" Then ; Check if sub has file to add If StringLeft($sCurFullFilePath, StringLen($sLastParentDirectory)) == $sLastParentDirectory Then $hLastParentChildItem = _GUICtrlTreeView_AddChild($hTreeView, $hLastParentTreeItem, $sCurFileName, $hIcon_Index, $hIcon_Index) ;Loop will end here ContinueLoop EndIf ;Create new parent folder & Update parents $sLastParentDirectory = $sCurFullFilePath $hLastParentTreeItem = _GUICtrlTreeView_Add($hTreeView, 0, StringFormat("%s", $sCurFileName), $hIcon_Index, $hIcon_Index) Else If Not $hLastParentChildItem Then ;ConsoleWrite($hLastParentTreeItem&" "&$sCurFileName&@CRLF) _GUICtrlTreeView_AddChild($hTreeView, $hLastParentTreeItem, $sCurFileName, $hIcon_Index, $hIcon_Index) Else _GUICtrlTreeView_AddChild($hTreeView, $hLastParentChildItem, $sCurFileName, $hIcon_Index, $hIcon_Index) EndIf EndIf Next ; End update _GUICtrlTreeView_EndUpdate($hTreeView) Return $aFileList EndFunc Func _Misc_GetFileName($sFilePath, $KeepExtension = True) ; Gets the filename Local $StringSPlit = StringSplit($sFilePath, "\") If Not $KeepExtension Then Return StringRegExpReplace($StringSPlit[$StringSPlit[0]], "\.(.*?)[a-zA-Z1234567890_-]{1,}+", "") Return $StringSPlit[$StringSPlit[0]] EndFunc ;==>_Misc_GetFileName Any tips ? Thanks in advance Socket-IO - An event-driven TCP UDF (Realtime chat example) AutoIt-API-WS - An expressive HTTP server you can use to build your own API with (Screenshots) Link to comment Share on other sites More sharing options...
JohnOne Posted February 6, 2016 Share Posted February 6, 2016 (edited) Looks like exactly what I'd expect, don't see any issue. Edited February 6, 2016 by JohnOne AutoIt Absolute Beginners Require a serial Pause Script Video Tutorials by Morthawt ipify Monkey's are, like, natures humans. Link to comment Share on other sites More sharing options...
tarretarretarre Posted February 6, 2016 Author Share Posted February 6, 2016 Well, if you compare the outcome with the cmd window, you can see it goes deeper, Socket-IO - An event-driven TCP UDF (Realtime chat example) AutoIt-API-WS - An expressive HTTP server you can use to build your own API with (Screenshots) Link to comment Share on other sites More sharing options...
JohnOne Posted February 6, 2016 Share Posted February 6, 2016 Yes, sorry, on closer inspection it does. AutoIt Absolute Beginners Require a serial Pause Script Video Tutorials by Morthawt ipify Monkey's are, like, natures humans. Link to comment Share on other sites More sharing options...
LarsJ Posted February 6, 2016 Share Posted February 6, 2016 tarretarretarre, Here here here is all what you need need need. Post 3. Controls, File Explorer, ROT objects, UI Automation, Windows Message MonitorCompiled code: Accessing AutoIt variables, DotNet.au3 UDF, Using C# and VB codeShell menus: The Context menu, The Favorites menu. Shell related: Control Panel, System Image ListsGraphics related: Rubik's Cube, OpenGL without external libraries, Navigating in an image, Non-rectangular selectionsListView controls: Colors and fonts, Multi-line header, Multi-line items, Checkboxes and icons, Incremental searchListView controls: Virtual ListViews, Editing cells, Data display functions Link to comment Share on other sites More sharing options...
kylomas Posted February 6, 2016 Share Posted February 6, 2016 (edited) 44 minutes ago, LarsJ said: tarretarretarre, Here here here is all what you need need need. Post 3. Damn near dumped my coffee on the kb when i read this...thanks for the laugh of the day LarsJ... Kylomas By the way, thanks for the example code. I have a "Hatfield and McCoy's" kind of relationship with treeview controls... Edited February 6, 2016 by kylomas Forum Rules Procedure for posting code "I like pigs. Dogs look up to us. Cats look down on us. Pigs treat us as equals." - Sir Winston Churchill Link to comment Share on other sites More sharing options...
tarretarretarre Posted February 7, 2016 Author Share Posted February 7, 2016 (edited) 13 hours ago, LarsJ said: tarretarretarre, Here here here is all what you need need need. Post 3. hey, thats my other topic, with the exact same question. Thank you Edited February 7, 2016 by tarretarretarre Socket-IO - An event-driven TCP UDF (Realtime chat example) AutoIt-API-WS - An expressive HTTP server you can use to build your own API with (Screenshots) Link to comment Share on other sites More sharing options...
tarretarretarre Posted February 9, 2016 Author Share Posted February 9, 2016 I solved it..... In the ghetto I got what i was aiming for. I will share if anyone else wanna look@it. Its really slow and uses 2 recurisve functions to: Sort files (windows style, folders first) http://i.imgur.com/3N6lC5K.png expandcollapse popup#include <GuiTreeView.au3> #include <WINapiSHELLEX.au3> #include <array.au3> $hGui = GUICreate("Demo1", 600, 400) $hTreeView = _GUICtrlTreeView_Create($hGui, 10, 10, 580, 380) GUISetState() Local $test = _GuictrlTreeview__FileListToArrayRec($hTreeView, @ScriptDir, ".au3", "BackUp;.git") _ArrayDisplay($test) ; Retrives a full array of directorys., here we use filters Func _GuictrlTreeview__FileListToArrayRec($hTreeView, $sRoot, $sAcceptedFiles = ".", $sExcludedFolders = "") Local $aReturn[1];All files stored here in 1D array Local $AcceptedFiles = StringSplit($sAcceptedFiles, ";") Local $ExcludedFolders = StringSplit($sExcludedFolders, ";") $FileListToArray = _FileListToSortedArray($sRoot, $AcceptedFiles, $ExcludedFolders) ; Dummy icon control. Local $hImageList = _GUIImageList_Create(16, 16, 5, 1) _GUICtrlTreeView_SetNormalImageList($hTreeView, $hImageList) _GUICtrlTreeView_BeginUpdate($hTreeView) _SortedArrayToTreeView($aReturn, $FileListToArray, 0, $hImageList) _GUICtrlTreeView_EndUpdate($hTreeView) Return $aReturn EndFunc ;==>_GuictrlTreeview__FileListToArrayRec Do Until GUIGetMsg() = -3 Func _SortedArrayToTreeView(ByRef $aReturn, ByRef $sSourceFolder, $hItem, $hImageList) Local $sCurFileName = "unkown :P", $aFileList, $newItem, $hIcon, $aCurFileList, $hIcon_Index For $i = 2 To $sSourceFolder[0]; Last arg of array push lets us start from 2 instead so we can save 2 for stuff ; Current "file array" $aFileList = $sSourceFolder[$i] ; Get Type If IsArray($aFileList) Then $aCurFileList = $aFileList[1] _Array_Push($aReturn, $aCurFileList) Else $aCurFileList = $aFileList _Array_Push($aReturn, $aCurFileList) EndIf ; Get short name $sCurFileName = _________GetFileName($aCurFileList) ; Get icon of file $hIcon = _WinAPI_ShellExtractAssociatedIcon($aCurFileList, 1) $hIcon_Index = _GUIImageList_ReplaceIcon($hImageList, -1, $hIcon) _WinAPI_DestroyIcon($hIcon) ; Check if "Folder" If IsArray($aFileList) Then ;Ghetto get the folder name $newItem = _GUICtrlTreeView_AddChild($hTreeView, $hItem, $sCurFileName, $hIcon_Index, $hIcon_Index) _SortedArrayToTreeView($aReturn, $aFileList, $newItem, $hImageList) Else ;(THIS WILL IGNORE EMPTY DIRECTORYS) SEARCH FOR THIS If Not $sCurFileName Then Else; Regular file _GUICtrlTreeView_AddChild($hTreeView, $hItem, $sCurFileName, $hIcon_Index, $hIcon_Index) EndIf EndIf Next EndFunc ;==>_SortedArrayToTreeView ;// Fuck yeah... Func _FileListToSortedArray($sSourceFolder, $AcceptedFiles, $ExcludedFolders) Local $newTree[1] Local $sFile, $sCurFullFilePath, $DeniedFolder, $DeniedFile ; Force a trailing \ If StringRight($sSourceFolder, 1) <> "\" Then $sSourceFolder &= "\" ; Add basedir to array _Array_Push($newTree, $sSourceFolder) ; Start the search Local $hSearch = FileFindFirstFile($sSourceFolder & "*.*") ; If no files found then return If $hSearch = -1 Then Return ; This is where we break the recursive loop <<<<<<<<<<<<<<<<<<<<<<<<<< ; Now run through the contents of the folder While 1 ; reset $DeniedFolder = False $DeniedFile = False ; Get next match $sFile = FileFindNextFile($hSearch) $sCurFullFilePath = $sSourceFolder & $sFile If @error Then ExitLoop ; This is where we break the recursive loop <<<<<<<<<<<<<<<<<<<<<<<<<< ; Check if a folder If @extended Then ; If so then call the function recursively ;Check if exluced folder For $i = 1 To $ExcludedFolders[0] If StringInStr($sFile, $ExcludedFolders[$i]) Then $DeniedFolder = True Next If $DeniedFolder Then ContinueLoop ;Fix empty dirs (THIS WILL IGNORE EMPTY DIRECTORYS) SEARCH FOR THIS Local $try = _FileListToSortedArray($sCurFullFilePath, $AcceptedFiles, $ExcludedFolders) If IsArray($try) Then _Array_Push($newTree, $try) EndIf Else ; If a file than write path and name For $i = 1 To $AcceptedFiles[0] If Not StringInStr($sFile, $AcceptedFiles[$i]) Then $DeniedFile = True Next If $DeniedFile Then ContinueLoop _Array_Push($newTree, $sCurFullFilePath) EndIf WEnd ;Sort this nigga _ArraySort($newTree, 0, 2) Return $newTree EndFunc ;==>_FileListToSortedArray Func _Array_Push(ByRef $a, $v) If Not IsArray($a) Then ConsoleWrite("! _Array_Push used with non array" & @CRLF) Return False EndIf ReDim $a[$a[0] + 2] $a[$a[0] + 1] = $v $a[0] += 1 Return $a[0] EndFunc ;==>_Array_Push Func _________GetFileName($sFilePath) If Not StringInStr($sFilePath, "\") Then Return False; $sFilePath (THIS WILL IGNORE EMPTY DIRECTORYS) SEARCH FOR THIS Local $StringSplit = StringSplit($sFilePath, "\") If StringRegExp($StringSplit[$StringSplit[0]], "\.(.*?)[a-zA-Z1234567890_-]{1,}+") Then Return $StringSplit[$StringSplit[0]] Return $StringSplit[$StringSplit[0] - 1] EndFunc ;==>_Misc_GetFileName Socket-IO - An event-driven TCP UDF (Realtime chat example) AutoIt-API-WS - An expressive HTTP server you can use to build your own API with (Screenshots) Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now