Jump to content

Coded my self into a corner


Nhardel
 Share

Recommended Posts

:)

Okay, so I'm pretty sure I thought about this way to hard! I am trying to build a treeviewlist of folder hierarchy contained within a zipfile. I am using the 7zip udf from rasim (UDF here) I use the call DllStructGetData($tINDIVIDUALINFO, "szFileName") to get the full path of a file contained within the zip. I build a 1d array based on that info.

Example:

[0]|11

[1]|Lab Backup\7-zip32.dll

[2]|Lab Backup\App Lab Backup.exe

[3]|Lab Backup\Backup.au3

[4]|Lab Backup\logs\20081229.log

[5]|Lab Backup\settings.ini

[6]|Lab Backup\test1\7-zip32.dll

[7]|Lab Backup\test1\Backup.au3

[8]|Lab Backup\test1\settings.ini

[9]|Lab Backup\test1\test2\7-zip32.dll

[10]|Lab Backup\test1\test2\Backup.au3

[11]|Lab Backup\test1\test2\settings.ini

I tried to figure out a way to get that info into a treeviewlist that would break it down into folder hierarchy. No go for me atleast

I then decided that I would break out each instance into a 2d array with string split

I also added a "\" at the end of each folder and gave each instance a depth# on column 0 of each row starting with 1 this produced an array of:

[0]|||||

[1]|2|Lab Backup\|7-zip32.dll||

[2]|2|Lab Backup\|App Lab Backup.exe||

[3]|2|Lab Backup\|Backup.au3||

[4]|3|Lab Backup\|logs\|20081229.log|

[5]|2|Lab Backup\|settings.ini||

[6]|3|Lab Backup\|test1\|7-zip32.dll|

[7]|3|Lab Backup\|test1\|Backup.au3|

[8]|3|Lab Backup\|test1\|settings.ini|

[9]|4|Lab Backup\|test1\|test2\|7-zip32.dll

[10]|4|Lab Backup\|test1\|test2\|Backup.au3

[11]|4|Lab Backup\|test1\|test2\|settings.ini

The best that I could get with that was each row correctly breaking itself down but no overlapping of folders between the rows in the array

See I told you I was probably going way overboard.

So then I thought the problem came from that fact that as I read my array that I would see multiple instances of the same folder structure so I revamped again so that it made more sence, at least to me it did. Outcome is this:

[0]|11|1|6|5|3

[1]|2|Lab Backup\|7-zip32.dll||

[2]|2||App Lab Backup.exe||

[3]|2||Backup.au3||

[4]|3||logs\|20081229.log|

[5]|2||settings.ini||

[6]|3||test1\|7-zip32.dll|

[7]|3|||Backup.au3|

[8]|3|||settings.ini|

[9]|4|||test2\|7-zip32.dll

[10]|4||||Backup.au3

[11]|4||||settings.ini

I have posted the code here

CODE
#include <Date.au3>

#include <7Zip.au3>

#include <array.au3>

#include <GUIConstants.au3>

#include <GuiTreeView.au3>

Opt("GUIOnEventMode", 1)

$drivemap = DriveMapAdd("*","\\usandl0000\app lab backup")

Global $1d = 1, $2d =1

Dim $testArray[1],$treeviewarray[$1d][$2d]

$ArcFile = FileOpenDialog("Select archive", "", "Archive Files (*.7z;*.zip;*.gzip;*.bzip2;*.tar)")

If @error Then Exit

$hArc = _7ZipOpenArchive(0, $ArcFile)

If $hArc = 0 Then Exit MsgBox(16, "_7ZipOpenArchive", "Error occured")

$tINDIVIDUALINFO = _7ZipFindFirst($hArc, "*.*")

If $tINDIVIDUALINFO = -1 Then Exit

logfile($tINDIVIDUALINFO)

While 1

$tINDIVIDUALINFO = _7ZipFindNext($hArc, $tINDIVIDUALINFO)

If $tINDIVIDUALINFO = 0 Then ExitLoop

logfile($tINDIVIDUALINFO)

WEnd

func logfile($tINDIVIDUALINFO)

_ArrayAdd($testArray, DllStructGetData($tINDIVIDUALINFO, "szFileName"))

EndFunc

_7ZipCloseArchive($hArc)

$a = DriveMapDel($drivemap)

$testArray[0] = ubound($testArray)-1

_ArrayDisplay($testArray)

$1d = $testArray[0] +1

redim $treeviewarray[$1d][$2d]

_ArraySort($testArray,0,1)

; Build special array for treeview

for $a = 1 to $testArray[0]

$b = StringSplit($testArray[$a],"\")

for $c = 1 to $b[0]-1

$b[$c] = $b[$c]&"\"

next

ConsoleWrite($a & " Check depth: $b[0] ="&$b[0]& " and $2d="& $2d & @crlf)

if $b[0] >= $2d Then

redim $treeviewarray[$1d][$b[0]+1]

$2d = $b[0] +1

endif

for $c = 0 to $b[0]

$treeviewarray[$a][$c] = $b[$c]

next

next

_ArrayDisplay($treeviewarray)

$treeviewarray[0][0] = ubound($treeviewarray,1)-1

$treeviewarray[0][1] = UBound($treeviewarray,2)-1

;~ _ArrayDisplay($treeviewarray)

For $a = 1 to $treeviewarray[0][1]

$b = 0

for $c = 1 to $treeviewarray[0][0]

if $treeviewarray[$c][$a] <> "" then

$b = $b + 1

$d = _arrayfindall($treeviewarray,$treeviewarray[$c][$a],1,"","","",$a)

for $e = 1 to Ubound($d)-1

$treeviewarray[$d[$e]][$a] =""

Next

EndIf

Next

$treeviewarray[0][$a] = $b

Next

_ArrayDisplay($treeviewarray)

Don't lynch me too hard I am very aware that the code is very dirty and terrible if at all documented This was more a POC part of my project that I just keeped building on. So my problem is where to go from here. I am pretty sure I need to use recursive disccover of my array to build the treeview but not real sure how to go about it. Any ideas. I did search the forums and didnt really find anything about building treeviews from an array. If I missed something I appoligize, just point me in the direction.
Link to comment
Share on other sites

Took me a while but it's working ... you'll have to figure out how to "sort" the tree so it will list items in order ... blah-blah..

You will need an array with your file list.

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

Global $done = 0
Global $lvl_counter = 10
Global $TreeView[10000]
Global $tree_level = 1
Global $parent_nodes
Global $nodes

Dim $a[12]
$a[1]="Lab Backup\7-zip32.dll"
$a[2]="Lab Backup\App Lab Backup.exe"
$a[3]="Lab Backup\Backup.au3"
$a[4]="Lab Backup\logs\20081229.log"
$a[5]="Lab Backup\settings.ini"
$a[6]="Lab Backup\test1\7-zip32.dll"
$a[7]="Lab Backup\test1\Backup.au3"
$a[8]="Lab Backup\test1\settings.ini"
$a[9]="Lab Backup\test1\test2\7-zip32.dll"
$a[10]="Lab Backup\test1\test2\Backup.au3"
$a[11]="Lab Backup\test1\test2\settings.ini"

Opt("GUIOnEventMode", 1)
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 267, 308, 193, 125)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
$TreeView1 = GUICtrlCreateTreeView(8, 8, 249, 289)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
_BuildTree()

While 1
    Sleep(100)
WEnd

Func Form1Close()
    Exit
EndFunc
Func _BuildTree()
    Do 
        $match = 0
        For $i=1 To UBound($a) -1
            $branch = StringSplit($a[$i], "\")
            If $branch[0] >= $tree_level Then
                If Not StringInStr($nodes, $branch[$tree_level]) Then;if node not created
                    If $tree_level = 1 Then                     ;if root (level 1)
                        If Not StringInStr($parent_nodes, $branch[$tree_level]) Then;if not added yet
                            $TreeView[$lvl_counter] = GUICtrlCreateTreeViewItem($branch[$tree_level], $TreeView1);add node
                            $parent_nodes &= $branch[$tree_level]&"|"&$lvl_counter&"%";record node name and array index for future use
                            $lvl_counter +=1                    ;increment the index
                        EndIf
                    Else
                        If StringInStr($parent_nodes, $branch[$tree_level -1]) Then;if parent found in $parent_nodes
                            $pos = StringInStr($parent_nodes, $branch[$tree_level -1])
                            $idx = StringMid($parent_nodes, $pos+1+ StringLen($branch[$tree_level -1]) , 2)
                            $TreeView[$lvl_counter] = GUICtrlCreateTreeViewItem($branch[$tree_level], $TreeView[$idx])
                            $nodes &= $branch[$tree_level]&"|"&$lvl_counter&"%"
                            $lvl_counter +=1
                        EndIf
                    EndIf
                EndIf
                $match += 1
            Else
                ContinueLoop
            EndIf
        Next
        If $tree_level > 1 Then $parent_nodes = $nodes
        $nodes = ""
        $tree_level += 1
        If $match = 0 Then $done = 1;if no more levels then prepare to exit loop
    Until $done = 1
    GUICtrlSetState($TreeView[10], $GUI_EXPAND);expand root
    ReDim $TreeView[$lvl_counter +1]    ;reDim the array
EndFunc

Good luck,

Edited by enaiman

SNMP_UDF ... for SNMPv1 and v2c so far, GetBulk and a new example script

wannabe "Unbeatable" Tic-Tac-Toe

Paper-Scissor-Rock ... try to beat it anyway :)

Link to comment
Share on other sites

:)

Okay, so I'm pretty sure I thought about this way to hard! I am trying to build a treeviewlist of folder hierarchy contained within a zipfile. I am using the 7zip udf from rasim (UDF here) I use the call DllStructGetData($tINDIVIDUALINFO, "szFileName") to get the full path of a file contained within the zip. I build a 1d array based on that info.

Example:

[0]|11

[1]|Lab Backup\7-zip32.dll

[2]|Lab Backup\App Lab Backup.exe

[3]|Lab Backup\Backup.au3

[4]|Lab Backup\logs\20081229.log

[5]|Lab Backup\settings.ini

[6]|Lab Backup\test1\7-zip32.dll

[7]|Lab Backup\test1\Backup.au3

[8]|Lab Backup\test1\settings.ini

[9]|Lab Backup\test1\test2\7-zip32.dll

[10]|Lab Backup\test1\test2\Backup.au3

[11]|Lab Backup\test1\test2\settings.ini

I tried to figure out a way to get that info into a treeviewlist that would break it down into folder hierarchy. No go for me atleast

I then decided that I would break out each instance into a 2d array with string split

I also added a "\" at the end of each folder and gave each instance a depth# on column 0 of each row starting with 1 this produced an array of:

[0]|||||

[1]|2|Lab Backup\|7-zip32.dll||

[2]|2|Lab Backup\|App Lab Backup.exe||

[3]|2|Lab Backup\|Backup.au3||

[4]|3|Lab Backup\|logs\|20081229.log|

[5]|2|Lab Backup\|settings.ini||

[6]|3|Lab Backup\|test1\|7-zip32.dll|

[7]|3|Lab Backup\|test1\|Backup.au3|

[8]|3|Lab Backup\|test1\|settings.ini|

[9]|4|Lab Backup\|test1\|test2\|7-zip32.dll

[10]|4|Lab Backup\|test1\|test2\|Backup.au3

[11]|4|Lab Backup\|test1\|test2\|settings.ini

The best that I could get with that was each row correctly breaking itself down but no overlapping of folders between the rows in the array

See I told you I was probably going way overboard.

So then I thought the problem came from that fact that as I read my array that I would see multiple instances of the same folder structure so I revamped again so that it made more sence, at least to me it did. Outcome is this:

[0]|11|1|6|5|3

[1]|2|Lab Backup\|7-zip32.dll||

[2]|2||App Lab Backup.exe||

[3]|2||Backup.au3||

[4]|3||logs\|20081229.log|

[5]|2||settings.ini||

[6]|3||test1\|7-zip32.dll|

[7]|3|||Backup.au3|

[8]|3|||settings.ini|

[9]|4|||test2\|7-zip32.dll

[10]|4||||Backup.au3

[11]|4||||settings.ini

I have posted the code here

CODE
#include <Date.au3>

#include <7Zip.au3>

#include <array.au3>

#include <GUIConstants.au3>

#include <GuiTreeView.au3>

Opt("GUIOnEventMode", 1)

$drivemap = DriveMapAdd("*","\\usandl0000\app lab backup")

Global $1d = 1, $2d =1

Dim $testArray[1],$treeviewarray[$1d][$2d]

$ArcFile = FileOpenDialog("Select archive", "", "Archive Files (*.7z;*.zip;*.gzip;*.bzip2;*.tar)")

If @error Then Exit

$hArc = _7ZipOpenArchive(0, $ArcFile)

If $hArc = 0 Then Exit MsgBox(16, "_7ZipOpenArchive", "Error occured")

$tINDIVIDUALINFO = _7ZipFindFirst($hArc, "*.*")

If $tINDIVIDUALINFO = -1 Then Exit

logfile($tINDIVIDUALINFO)

While 1

$tINDIVIDUALINFO = _7ZipFindNext($hArc, $tINDIVIDUALINFO)

If $tINDIVIDUALINFO = 0 Then ExitLoop

logfile($tINDIVIDUALINFO)

WEnd

func logfile($tINDIVIDUALINFO)

_ArrayAdd($testArray, DllStructGetData($tINDIVIDUALINFO, "szFileName"))

EndFunc

_7ZipCloseArchive($hArc)

$a = DriveMapDel($drivemap)

$testArray[0] = ubound($testArray)-1

_ArrayDisplay($testArray)

$1d = $testArray[0] +1

redim $treeviewarray[$1d][$2d]

_ArraySort($testArray,0,1)

; Build special array for treeview

for $a = 1 to $testArray[0]

$b = StringSplit($testArray[$a],"\")

for $c = 1 to $b[0]-1

$b[$c] = $b[$c]&"\"

next

ConsoleWrite($a & " Check depth: $b[0] ="&$b[0]& " and $2d="& $2d & @crlf)

if $b[0] >= $2d Then

redim $treeviewarray[$1d][$b[0]+1]

$2d = $b[0] +1

endif

for $c = 0 to $b[0]

$treeviewarray[$a][$c] = $b[$c]

next

next

_ArrayDisplay($treeviewarray)

$treeviewarray[0][0] = ubound($treeviewarray,1)-1

$treeviewarray[0][1] = UBound($treeviewarray,2)-1

;~ _ArrayDisplay($treeviewarray)

For $a = 1 to $treeviewarray[0][1]

$b = 0

for $c = 1 to $treeviewarray[0][0]

if $treeviewarray[$c][$a] <> "" then

$b = $b + 1

$d = _arrayfindall($treeviewarray,$treeviewarray[$c][$a],1,"","","",$a)

for $e = 1 to Ubound($d)-1

$treeviewarray[$d[$e]][$a] =""

Next

EndIf

Next

$treeviewarray[0][$a] = $b

Next

_ArrayDisplay($treeviewarray)

Don't lynch me too hard I am very aware that the code is very dirty and terrible if at all documented This was more a POC part of my project that I just keeped building on. So my problem is where to go from here. I am pretty sure I need to use recursive disccover of my array to build the treeview but not real sure how to go about it. Any ideas. I did search the forums and didnt really find anything about building treeviews from an array. If I missed something I appoligize, just point me in the direction.
Since that part works, all of the 7-zip stuff is a useless distraction from the issue of how to populate the TreeView. This demo takes your data from an array and populates a TreeView with it:
#include <GUIConstantsEx.au3>
#include <GuiTreeView.au3>
#include <array.au3>; Only for _ArrayDisplay()

Opt("GUIOnEventMode", 1)

Global $testArray[11] = ["Lab Backup\7-zip32.dll", "Lab Backup\App Lab Backup.exe", _
"Lab Backup\Backup.au3", "Lab Backup\logs\20081229.log", "Lab Backup\settings.ini", _
"Lab Backup\test1\7-zip32.dll", "Lab Backup\test1\Backup.au3", _
"Lab Backup\test1\settings.ini", "Lab Backup\test1\test2\7-zip32.dll", _
"Lab Backup\test1\test2\Backup.au3", "Lab Backup\test1\test2\settings.ini"]
_ArrayDisplay($testArray, "$testArray")

Global $hGUI, $hTV1, $sPathList = Chr(1)

$hGUI = GUICreate("Test", 400, 300)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Quit")
$hTV1 = _GUICtrlTreeView_Create($hGUI, 20, 10, 360, 230)
$idButton = GUICtrlCreateButton("Populate TreeView", 150, 260, 100, 30)
GUICtrlSetOnEvent($idButton, "_PopulateTV1")
GUISetState(@SW_SHOW, $hGUI)

While 1
    Sleep(10)
WEnd

Func _PopulateTV1()
    _GUICtrlTreeView_BeginUpdate($hTV1)
    For $n = 0 To UBound($testArray) - 1
        _AddToTV1($testArray[$n])
    Next
    _GUICtrlTreeView_EndUpdate($hTV1)
EndFunc

Func _AddToTV1($sPath)
    Local $avPath = StringSplit($sPath, "\")
    Local $hParent = 0; 0 = Root
    Local $hFound, $sTestPath
    
    For $n = 1 To $avPath[0]
        $sTestPath &= $avPath[$n]
        $hFound = _GUICtrlTreeView_FindItemEx($hTV1, $sTestPath, 0)
        If $hFound = 0 Then
        ; Not found, add new item and set as new parent
            $hParent = _GUICtrlTreeView_AddChild($hTV1, $hParent, $avPath[$n])
        Else
        ; Found, set as new parent and continue
            $hParent = $hFound
        EndIf
        $sTestPath &= "|"
    Next
EndFunc

Func _Quit()
    Exit
EndFunc

Happy New Year!

:o

Valuater's AutoIt 1-2-3, Class... Is now in Session!For those who want somebody to write the script for them: RentACoder"Any technology distinguishable from magic is insufficiently advanced." -- Geek's corollary to Clarke's law
Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...