Jump to content

Recommended Posts

Posted

Hello,
I'm trying to adapt the code originally posted by kosamja's
 here to where I can use it with mounted backup images or archives. For example I want to list the files and folders for the image mounted as "D:" but display it as the original drive letter from the system imaged "C:".  I've been trying many things including using GUICtrlSetData to change the letter at various points in the code but it doesn't work. I've attached my revision of your code. I appreciate any assistance anyone could give pointing me in the right direction. 

 

#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Outfile=FileRestore.Exe
#AutoIt3Wrapper_Outfile_x64=FileRestore_x64.exe
#AutoIt3Wrapper_Compile_Both=y
#AutoIt3Wrapper_UseX64=y
#AutoIt3Wrapper_Res_Description=File Restore
#AutoIt3Wrapper_Res_Fileversion=1.0.0.0
#AutoIt3Wrapper_Res_ProductVersion=1.0.0
#AutoIt3Wrapper_Res_Language=1033
#AutoIt3Wrapper_Res_requestedExecutionLevel=requireAdministrator
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
;~ #RequireAdmin
#include <Constants.au3>
#include <GUIConstants.au3>
#include <MenuConstants.au3>
#include <WinAPISys.au3>
#include <WinAPIMisc.au3>
#include <WinAPIFiles.au3>
#include <WinAPIConv.au3>
#include <WinAPIIcons.au3>
#include <WinAPITheme.au3>
#include <WinAPIShellEx.au3>
#include <WinAPISysWin.au3>
#include <GuiImageList.au3>
#include <GuiTreeView.au3>
#include <Array.au3>
#include <Misc.au3>
#include <File.au3>
#include <String.au3>


;~ If $CmdLine[1] = "-f" Then
;~ $Listvol = $CmdLine[2]
;~ EndIf

Opt('GUIOnEventMode', 1)

Global $sTreeViewItemHandle, $keepfullpath
$Listvol = "d"
$displayvol = "c"

FileRestoreGUI()

Func FileRestoreGUI()
    Global $FileRestoreGui = GUICreate('', 500, 400, -1, -1, BitOR($WS_CAPTION, $WS_SYSMENU, $WS_MINIMIZEBOX))
    Global $FileExplorerTreeView = GUICtrlCreateTreeView(30, 30, 200, 300, BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_CHECKBOXES))
    Global $CheckedFilesButton = GUICtrlCreateButton('Restore', 200, 350, 100, 30, BitOR($BS_CENTER, $BS_MULTILINE))
    Global $Restore2New = GUICtrlCreateCheckbox("Restore to Original Location", 250, 30)
    Global $OverWriteExisting = GUICtrlCreateCheckbox("Overwrite existing files", 250, 60)
    Global $keeppath = GUICtrlCreateCheckbox("Retain full path", 250, 90)
    Global $SelRestoreFolder = GUICtrlCreateButton("", 250, 120, 25, 25, $BS_ICON)
    GUICtrlSetImage(-1, @ScriptDir & "\images\folder_sm.ico", -1)
    Global $FileRestorePath = GUICtrlCreateInput("E:\", 277, 122, 193, 20)
    Global $selectfiles_lbl = GUICtrlCreateLabel("Please Select the File(s) to be Restored", 30, 10)
    Global $ImageListIconWidth = _WinAPI_GetSystemMetrics($SM_CXSMICON)
    Global $ImageListIconHeight = _WinAPI_GetSystemMetrics($SM_CYSMICON)
    Global $TreeViewImageListHandle = _GUIImageList_Create($ImageListIconWidth, $ImageListIconHeight, 5, 1)
    _GUICtrlTreeView_SetNormalImageList($FileExplorerTreeView, $TreeViewImageListHandle)
    _WinAPI_SetWindowTheme(ControlGetHandle($FileRestoreGui, '', $FileExplorerTreeView), 'Explorer', 0)
    GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
    GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
    GUIRegisterMsg($WM_SYSCOMMAND, 'WM_SYSCOMMAND')
    GUIRegisterMsg($WM_DEVICECHANGE, 'WM_DEVICECHANGE')
    GUISetState(@SW_SHOW, $FileRestoreGui)

    GUICtrlSetOnEvent($Restore2New, 'GUI_Events_RestoreFile')
    GUICtrlSetOnEvent($SelRestoreFolder, 'GUI_Events_RestoreFile')
    GUICtrlSetOnEvent($OverWriteExisting, 'GUI_Events_RestoreFile')
    GUICtrlSetOnEvent($keeppath, 'GUI_Events_RestoreFile')
    Global $overwrite = 0
    Global $keepfullpath = 0

    $DriveTypesList = StringSplit('ALL', '|', $STR_ENTIRESPLIT)
    For $i = 1 To $DriveTypesList[0]
        $DrivesList = DriveGetDrive($DriveTypesList[$i])
        If IsArray($DrivesList) Then
            For $j = 1 To $DrivesList[0]
                If DriveStatus($DrivesList[$j]) = 'READY' And StringInStr($Listvol, StringTrimRight($DrivesList[$j], 1)) Then
                    $TreeViewItemHandle = _GUICtrlTreeView_FindItemEx($FileExplorerTreeView, StringUpper($DrivesList[$j]))
                    If $TreeViewItemHandle <> 0 Then
                        _GUICtrlTreeView_DeleteChildren($FileExplorerTreeView, $TreeViewItemHandle)
                        _GUICtrlTreeView_Delete($FileExplorerTreeView, $TreeViewItemHandle)
                    EndIf
                    $TreeViewItemId = GUICtrlCreateTreeViewItem(StringUpper($DrivesList[$j]), $FileExplorerTreeView)
                    If $TreeViewItemId <> 0 Then
                        _SetTreeViewItemIcon($FileExplorerTreeView, GUICtrlGetHandle($TreeViewItemId))
                        _GUICtrlTreeView_SetChildren($FileExplorerTreeView, GUICtrlGetHandle($TreeViewItemId), True)
                    EndIf
                EndIf
            Next
        EndIf
    Next

EndFunc   ;==>FileRestoreGUI

While 1
    Sleep(1000)
WEnd

Func _ForceQuit()
    TraySetState($TRAY_ICONSTATE_HIDE)
    ProcessClose(@AutoItPID)
EndFunc   ;==>_ForceQuit

Func WM_SYSCOMMAND($hWnd, $iMsg, $wParam, $lParam)
    Switch $wParam
        Case $SC_CLOSE
            _ForceQuit()
    EndSwitch
EndFunc   ;==>WM_SYSCOMMAND

Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    If Not IsDeclared('__ControlEventHandlerDummy') Then
        Global $__ControlEventHandlerDummy = GUICtrlCreateDummy()
        GUICtrlSetOnEvent($__ControlEventHandlerDummy, '_ControlEventHandlerProc')
    EndIf
    If Not IsDeclared('__ControlEventInfo') Then Global $__ControlEventInfo = 0
    If Not IsDeclared('__TreeViewItemExpanding') Then Global $__TreeViewItemExpanding = False
    If Not IsDeclared('__PreviousGuiEventModeState') Then Global $__PreviousGuiEventModeState = Opt('GUIOnEventMode')
    If _WinAPI_GetClassName($lParam) <> 'SysTreeView32' And $__TreeViewItemExpanding = True Then
        MsgBox($MB_OK, 'Info', 'Please wait until treeview finishes expanding selected item.')
        Return 1
    Else
        Switch _WinAPI_GetClassName($lParam)
            Case 'Button'
                Switch _WinAPI_HiWord($wParam)
                    Case $BN_CLICKED
                        Switch _WinAPI_LoWord($wParam)
                            Case $CheckedFilesButton
                                $__PreviousGuiEventModeState = Opt('GUIOnEventMode', 1)
                                $__ControlEventInfo = _WinAPI_MakeLong(_WinAPI_LoWord($wParam), _WinAPI_HiWord($wParam))
                                GUICtrlSendToDummy($__ControlEventHandlerDummy, 0)
                        EndSwitch
                EndSwitch
        EndSwitch
    EndIf
EndFunc   ;==>WM_COMMAND

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    If Not IsDeclared('__ControlEventHandlerDummy') Then
        Global $__ControlEventHandlerDummy = GUICtrlCreateDummy()
        GUICtrlSetOnEvent($__ControlEventHandlerDummy, '_ControlEventHandlerProc')
    EndIf
    If Not IsDeclared('__ControlEventInfo') Then Global $__ControlEventInfo = 0
    If Not IsDeclared('__TreeViewItemExpanding') Then Global $__TreeViewItemExpanding = False
    If Not IsDeclared('__CheckedTreeViewItemPaths') Then Global $__CheckedTreeViewItemPaths = ''
    If Not IsDeclared('__PreviousGuiEventModeState') Then Global $__PreviousGuiEventModeState = Opt('GUIOnEventMode')
    Local $sDrive, $sDir, $sFilename, $sExtension
    $tNotificationHeaderInfo = DllStructCreate($tagNMHDR, $lParam)
    Switch _WinAPI_GetClassName(DllStructGetData($tNotificationHeaderInfo, 'hWndFrom'))
        Case 'SysTreeView32'
            Switch DllStructGetData($tNotificationHeaderInfo, 'Code')
                Case $NM_CLICK, $NM_DBLCLK
                    $sTreeViewEvent = DllStructGetData($tNotificationHeaderInfo, 'Code')
                    $sTreeViewHandle = DllStructGetData($tNotificationHeaderInfo, 'hWndFrom')
                    $tPointControl = _WinAPI_GetMousePos(True, $sTreeViewHandle)
                    $tTreeViewHitTestInfo = _GUICtrlTreeView_HitTestEx($sTreeViewHandle, DllStructGetData($tPointControl, 'X'), DllStructGetData($tPointControl, 'Y'))
                    $sTreeViewItemHandle = DllStructGetData($tTreeViewHitTestInfo, 'Item')
                    $sTreeViewHitTestFlags = DllStructGetData($tTreeViewHitTestInfo, 'Flags')
                    $sTreeViewItemPath = StringReplace(_GUICtrlTreeView_GetTree($sTreeViewHandle, $sTreeViewItemHandle), Opt('GUIDataSeparatorChar'), '\')
                    If $sTreeViewItemPath <> '' And Not StringInStr($sTreeViewItemPath, '\') Then $sTreeViewItemPath = $sTreeViewItemPath & '\'
                    Select
                        Case $sTreeViewEvent = $NM_CLICK And BitAND($sTreeViewHitTestFlags, $TVHT_ONITEMSTATEICON)
                            ;notification is generated before item state is changed
                            If _GUICtrlTreeView_GetChecked($sTreeViewHandle, $sTreeViewItemHandle) = False Then
                                $__CheckedTreeViewItemPaths = $__CheckedTreeViewItemPaths & $sTreeViewItemPath & @CRLF
                            Else
                                $__CheckedTreeViewItemPaths = StringReplace($__CheckedTreeViewItemPaths, $sTreeViewItemPath & @CRLF, '')
                            EndIf
                        Case ($sTreeViewEvent = $NM_CLICK And BitAND($sTreeViewHitTestFlags, $TVHT_ONITEMBUTTON)) Or ($sTreeViewEvent = $NM_DBLCLK And (BitAND($sTreeViewHitTestFlags, $TVHT_ONITEMICON) Or BitAND($sTreeViewHitTestFlags, $TVHT_ONITEMLABEL)))
                            If $__TreeViewItemExpanding = True Then
                                If _GUICtrlTreeView_GetExpanded($sTreeViewHandle, $sTreeViewItemHandle) = False Then
                                    MsgBox($MB_OK, 'Info', 'Cant expand multiple treeview items at the same time, please wait until treeview finishes expanding previously selected item.')
                                    $sSelectedTreeViewItemHandle = _GUICtrlTreeView_GetSelection($sTreeViewHandle)
                                    If $sSelectedTreeViewItemHandle <> 0 Then _GUICtrlTreeView_SetSelected($sTreeViewHandle, $sSelectedTreeViewItemHandle, False)
                                EndIf
                                Return 1
                            Else
                                If _GUICtrlTreeView_GetExpanded($sTreeViewHandle, $sTreeViewItemHandle) = False And _GUICtrlTreeView_GetChildCount($sTreeViewHandle, $sTreeViewItemHandle) <= 0 Then
                                    _PathSplit($sTreeViewItemPath, $sDrive, $sDir, $sFilename, $sExtension)
                                    Switch DriveStatus($sDrive)
                                        Case 'READY'
                                            If _GUICtrlTreeView_GetChildren($sTreeViewHandle, $sTreeViewItemHandle) = True And _GUICtrlTreeView_GetChildCount($sTreeViewHandle, $sTreeViewItemHandle) <= 0 Then
                                                $__PreviousGuiEventModeState = Opt('GUIOnEventMode', 1)
                                                $__ControlEventInfo = _WinAPI_MakeLong(DllStructGetData($tNotificationHeaderInfo, 'IDFrom'), $sTreeViewEvent)
                                                GUICtrlSendToDummy($__ControlEventHandlerDummy, _WinAPI_MakeLong(_GUICtrlTreeView_GetItemParam($sTreeViewHandle, $sTreeViewItemHandle), $sTreeViewHitTestFlags))
                                            EndIf
                                        Case Else
                                            _GUICtrlTreeView_SetChecked($sTreeViewHandle, $sTreeViewItemHandle, False)
                                            _GUICtrlTreeView_DeleteChildren($sTreeViewHandle, $sTreeViewItemHandle)
                                            _GUICtrlTreeView_SetChildren($sTreeViewHandle, $sTreeViewItemHandle, True)
                                            $sCheckedTreeViewItemsPathList = StringSplit($__CheckedTreeViewItemPaths, @CRLF, $STR_ENTIRESPLIT)
                                            If IsArray($sCheckedTreeViewItemsPathList) Then
                                                For $i = 1 To $sCheckedTreeViewItemsPathList[0]
                                                    If StringLeft($sCheckedTreeViewItemsPathList[$i], StringLen($sDrive & '\')) = ($sDrive & '\') Then $__CheckedTreeViewItemPaths = StringReplace($__CheckedTreeViewItemPaths, $sCheckedTreeViewItemsPathList[$i] & @CRLF, '')
                                                Next
                                            EndIf
                                            MsgBox($MB_OK, 'Info', 'Drive ' & StringUpper($sDrive) & ' is not ready.')
                                    EndSwitch
                                EndIf
                            EndIf
                        Case $sTreeViewEvent = $NM_DBLCLK And BitAND($sTreeViewHitTestFlags, $TVHT_ONITEMBUTTON)
                            If $__TreeViewItemExpanding = True And _GUICtrlTreeView_GetExpanded($sTreeViewHandle, $sTreeViewItemHandle) = True Then Return 1
                    EndSelect
                Case $TVN_SELCHANGINGA, $TVN_SELCHANGINGW, $NM_SETFOCUS
                    Return 1
            EndSwitch
    EndSwitch
EndFunc   ;==>WM_NOTIFY

Func WM_DEVICECHANGE($hWnd, $iMsg, $wParam, $lParam)
    $DBTF_NET = 0x0002
    $DBTF_MEDIA = 0x0001
    $DBT_DEVICEARRIVAL = 0x00008000
    $DBT_DEVTYP_VOLUME = 0x00000002
    $DBT_DEVICEREMOVECOMPLETE = 0x00008004
    $sDevBroadcastHeaderInfo = 'dword dbch_size;dword dbch_devicetype;dword dbch_reserved'
    $sDevBroadcastVolumeInfo = 'dword dbcv_size;dword dbcv_devicetype;dword dbcv_reserved;dword dbcv_unitmask;dword dbcv_flags'
    Switch $wParam
        Case $DBT_DEVICEARRIVAL
            $tDevBroadcastHeaderInfo = DllStructCreate($sDevBroadcastHeaderInfo, $lParam)
            Switch DllStructGetData($tDevBroadcastHeaderInfo, 'dbch_devicetype')
                Case $DBT_DEVTYP_VOLUME
                    $tDevBroadcastVolumeInfo = DllStructCreate($sDevBroadcastVolumeInfo, $lParam)
                    $sVolumeUnitMask = DllStructGetData($tDevBroadcastVolumeInfo, 'dbcv_unitmask')
                    $sDrivesList = StringSplit(StringUpper(_GetDriveLetterFromVolumeUnitMask($sVolumeUnitMask)), '|', $STR_ENTIRESPLIT)
                    For $i = 1 To $sDrivesList[0]
                        $sTreeViewItemHandle = _GUICtrlTreeView_FindItemEx($FileExplorerTreeView, StringUpper($sDrivesList[$i]))
                        If $sTreeViewItemHandle <> 0 Then
                            _GUICtrlTreeView_DeleteChildren($FileExplorerTreeView, $sTreeViewItemHandle)
                            _GUICtrlTreeView_Delete($FileExplorerTreeView, $sTreeViewItemHandle)
                        EndIf
                        $sTreeViewItemId = GUICtrlCreateTreeViewItem(StringUpper($sDrivesList[$i]), $FileExplorerTreeView)
                        If $sTreeViewItemId <> 0 Then
                            _SetTreeViewItemIcon($FileExplorerTreeView, GUICtrlGetHandle($sTreeViewItemId))
                            _GUICtrlTreeView_SetChildren($FileExplorerTreeView, GUICtrlGetHandle($sTreeViewItemId), True)
                        EndIf
                    Next
            EndSwitch
        Case $DBT_DEVICEREMOVECOMPLETE
            $tDevBroadcastHeaderInfo = DllStructCreate($sDevBroadcastHeaderInfo, $lParam)
            Switch DllStructGetData($tDevBroadcastHeaderInfo, 'dbch_devicetype')
                Case $DBT_DEVTYP_VOLUME
                    $tDevBroadcastVolumeInfo = DllStructCreate($sDevBroadcastVolumeInfo, $lParam)
                    $sVolumeUnitMask = DllStructGetData($tDevBroadcastVolumeInfo, 'dbcv_unitmask')
                    $sDrivesList = StringSplit(StringUpper(_GetDriveLetterFromVolumeUnitMask($sVolumeUnitMask)), '|', $STR_ENTIRESPLIT)
                    For $i = 1 To $sDrivesList[0]
                        $sTreeViewItemHandle = _GUICtrlTreeView_FindItemEx($FileExplorerTreeView, StringUpper($sDrivesList[$i]))
                        If $sTreeViewItemHandle <> 0 Then
                            _GUICtrlTreeView_DeleteChildren($FileExplorerTreeView, $sTreeViewItemHandle)
                            _GUICtrlTreeView_Delete($FileExplorerTreeView, $sTreeViewItemHandle)
                        EndIf
                        $sCheckedTreeViewItemsPathList = StringSplit($__CheckedTreeViewItemPaths, @CRLF, $STR_ENTIRESPLIT)
                        If IsArray($sCheckedTreeViewItemsPathList) Then
                            For $j = 1 To $sCheckedTreeViewItemsPathList[0]
                                If StringLeft($sCheckedTreeViewItemsPathList[$j], StringLen($sDrivesList[$i] & '\')) = ($sDrivesList[$i] & '\') Then $__CheckedTreeViewItemPaths = StringReplace($__CheckedTreeViewItemPaths, $sCheckedTreeViewItemsPathList[$j] & @CRLF, '')
                            Next
                        EndIf
                    Next
            EndSwitch
    EndSwitch
EndFunc   ;==>WM_DEVICECHANGE

Func _ControlEventHandlerProc()
    If Not IsDeclared('__ControlEventHandlerDummy') Then
        Global $__ControlEventHandlerDummy = GUICtrlCreateDummy()
        GUICtrlSetOnEvent($__ControlEventHandlerDummy, '_ControlEventHandlerProc')
    EndIf
    If Not IsDeclared('__ControlEventInfo') Then Global $__ControlEventInfo = 0
    If Not IsDeclared('__TreeViewItemExpanding') Then Global $__TreeViewItemExpanding = False
    If Not IsDeclared('__PreviousGuiEventModeState') Then Global $__PreviousGuiEventModeState = Opt('GUIOnEventMode')
    Opt('GUIOnEventMode', $__PreviousGuiEventModeState)
    Switch _WinAPI_LoWord($__ControlEventInfo)
        Case $CheckedFilesButton
            _ProcessCheckedFiles()
        Case $FileExplorerTreeView
            $sTreeViewEvent = _WinAPI_HiWord($__ControlEventInfo)
            $sTreeViewHandle = GUICtrlGetHandle(_WinAPI_LoWord($__ControlEventInfo))
            $sTreeViewItemHandle = GUICtrlGetHandle(_WinAPI_LoWord(GUICtrlRead($__ControlEventHandlerDummy)))
            $sTreeViewHitTestFlags = _WinAPI_HiWord(GUICtrlRead($__ControlEventHandlerDummy))
            If ($sTreeViewEvent = $NM_CLICK And BitAND($sTreeViewHitTestFlags, $TVHT_ONITEMBUTTON)) Or ($sTreeViewEvent = $NM_DBLCLK And (BitAND($sTreeViewHitTestFlags, $TVHT_ONITEMICON) Or BitAND($sTreeViewHitTestFlags, $TVHT_ONITEMLABEL))) Then
                $__TreeViewItemExpanding = True
                _AddFolderContentToTreeView($sTreeViewHandle, $sTreeViewItemHandle)
                $__TreeViewItemExpanding = False
            EndIf
    EndSwitch
    $__ControlEventInfo = 0
EndFunc   ;==>_ControlEventHandlerProc

Func _AddFolderContentToTreeView($sTreeViewHandle, $sParentTreeViewItemHandle, $sIncludeHiddenPaths = True, $sIncludeSuperHiddenPaths = True, $sAutoExpand = True)
    $SHCONTF_FOLDERS = 0x00020
    $SHCONTF_NONFOLDERS = 0x00040
    $SHCONTF_INCLUDEHIDDEN = 0x00080
    $SHCONTF_INCLUDESUPERHIDDEN = 0x10000
    $sParentTreeViewItemExpanded = False
    If Not IsHWnd($sTreeViewHandle) And GUICtrlGetHandle($sTreeViewHandle) = 0 Then Return SetError(1, 0, False)
    $sParentTreeViewItemId = _GUICtrlTreeView_GetItemParam($sTreeViewHandle, $sParentTreeViewItemHandle)
    $sParentTreeViewItemPath = StringReplace(_GUICtrlTreeView_GetTree($sTreeViewHandle, $sParentTreeViewItemHandle), Opt('GUIDataSeparatorChar'), '\')
    If $sParentTreeViewItemPath <> '' And Not StringInStr($sParentTreeViewItemPath, '\') Then $sParentTreeViewItemPath = $sParentTreeViewItemPath & '\'
    If Not FileExists($sParentTreeViewItemPath) Then Return SetError(2, 0, False)
    $oShellFolderItems = _GetShellFolderObject($sParentTreeViewItemPath, True)
    If Not IsObj($oShellFolderItems) Then Return SetError(3, 0, False)
    $oShellFolderItemsFilterFlags = $SHCONTF_FOLDERS
    If $sIncludeHiddenPaths = True Then $oShellFolderItemsFilterFlags = BitOR($oShellFolderItemsFilterFlags, $SHCONTF_INCLUDEHIDDEN)
    If $sIncludeSuperHiddenPaths = True Then $oShellFolderItemsFilterFlags = BitOR($oShellFolderItemsFilterFlags, $SHCONTF_INCLUDESUPERHIDDEN)
    $oShellFolderItems.Filter($oShellFolderItemsFilterFlags, '*')
    For $oShellFolderItem In $oShellFolderItems
        $sShellFolderItemName = $oShellFolderItem.Name()
        If StringRight($oShellFolderItem.Path(), StringLen('.lnk')) = '.lnk' Then $sShellFolderItemName = $sShellFolderItemName & '.lnk'
        $sTreeViewItemId = GUICtrlCreateTreeViewItem($sShellFolderItemName, $sParentTreeViewItemId)
        If $sTreeViewItemId <> 0 Then
            _SetTreeViewItemIcon($sTreeViewHandle, GUICtrlGetHandle($sTreeViewItemId))
            $sFolderInfo = DirGetSize($oShellFolderItem.Path(), $DIR_EXTENDED + $DIR_NORECURSE)
            If IsArray($sFolderInfo) Then
                $sFolderContentCount = $sFolderInfo[1] + $sFolderInfo[2]
                If $sFolderContentCount > 0 Then _GUICtrlTreeView_SetChildren($sTreeViewHandle, GUICtrlGetHandle($sTreeViewItemId), True)
            EndIf
            If $sParentTreeViewItemExpanded = False And $sAutoExpand = True Then
                _GUICtrlTreeView_Expand($sTreeViewHandle, $sParentTreeViewItemHandle, True)
                $sParentTreeViewItemExpanded = True
            EndIf
        EndIf
    Next
    $oShellFolderItemsFilterFlags = BitOR(BitXOR($oShellFolderItemsFilterFlags, $SHCONTF_FOLDERS), $SHCONTF_NONFOLDERS)
    $oShellFolderItems.Filter($oShellFolderItemsFilterFlags, '*')
    For $oShellFolderItem In $oShellFolderItems
        $sShellFolderItemName = $oShellFolderItem.Name()
        If StringRight($oShellFolderItem.Path(), StringLen('.lnk')) = '.lnk' Then $sShellFolderItemName = $sShellFolderItemName & '.lnk'
        $sTreeViewItemId = GUICtrlCreateTreeViewItem($sShellFolderItemName, $sParentTreeViewItemId)
        If $sTreeViewItemId <> 0 Then
            _SetTreeViewItemIcon($sTreeViewHandle, GUICtrlGetHandle($sTreeViewItemId))
            If $sParentTreeViewItemExpanded = False And $sAutoExpand = True Then
                _GUICtrlTreeView_Expand($sTreeViewHandle, $sParentTreeViewItemHandle, True)
                $sParentTreeViewItemExpanded = True
            EndIf
        EndIf
    Next
    Return True
EndFunc   ;==>_AddFolderContentToTreeView

Func _GetShellFolderObject($sPath, $sReturnFolderItemsObject = False)
    If Not FileExists($sPath) Then Return SetError(1, 0, False)
    $oShellApplication = ObjCreate('Shell.Application')
    If Not IsObj($oShellApplication) Then Return SetError(2, 0, False)
    $oShellFolder = $oShellApplication.NameSpace($sPath)
    If Not IsObj($oShellFolder) Then Return SetError(3, 0, False)
    If $sReturnFolderItemsObject = False Then Return $oShellFolder
    $oShellFolderItems = $oShellFolder.Items()
    If Not IsObj($oShellFolderItems) Then Return SetError(4, 0, False)
    Return $oShellFolderItems
EndFunc   ;==>_GetShellFolderObject

Func _SetTreeViewItemIcon($sTreeViewHandle, $sTreeViewItemHandle)
    Local $sDrive, $sDir, $sFilename, $sExtension
    If Not IsHWnd($sTreeViewHandle) And GUICtrlGetHandle($sTreeViewHandle) = 0 Then Return SetError(1, 0, False)
    $sTreeViewImageListHandle = _GUICtrlTreeView_GetNormalImageList($sTreeViewHandle)
    If $sTreeViewImageListHandle = 0 Then Return SetError(2, 0, False)
    $sTreeViewItemPath = StringReplace(_GUICtrlTreeView_GetTree($sTreeViewHandle, $sTreeViewItemHandle), Opt('GUIDataSeparatorChar'), '\')
    If $sTreeViewItemPath <> '' And Not StringInStr($sTreeViewItemPath, '\') Then $sTreeViewItemPath = $sTreeViewItemPath & '\'
    If Not FileExists($sTreeViewItemPath) Then Return SetError(3, 0, False)
    _PathSplit($sTreeViewItemPath, $sDrive, $sDir, $sFilename, $sExtension)
    $sIconPath = ''
    $sIconIndex = 0
    If $sExtension = '.lnk' Then
        $sShortcutInfo = FileGetShortcut($sTreeViewItemPath)
        If IsArray($sShortcutInfo) Then
            $sTreeViewItemPath = _WinAPI_ExpandEnvironmentStrings($sShortcutInfo[0])
            If FileExists(_WinAPI_ExpandEnvironmentStrings($sShortcutInfo[4])) Then
                $sIconPath = _WinAPI_ExpandEnvironmentStrings($sShortcutInfo[4])
                $sIconIndex = $sShortcutInfo[5]
            EndIf
        EndIf
    EndIf
    _PathSplit($sTreeViewItemPath, $sDrive, $sDir, $sFilename, $sExtension)
    If $sExtension = '.url' Then
        $sIconPath = _WinAPI_ExpandEnvironmentStrings(IniRead($sTreeViewItemPath, 'InternetShortcut', 'IconFile', ''))
        $sIconIndex = IniRead($sTreeViewItemPath, 'InternetShortcut', 'IconIndex', '')
    EndIf
    If FileExists($sIconPath) Then
        $sImageListIconIndex = _GUIImageList_AddIcon($sTreeViewImageListHandle, $sIconPath, $sIconIndex)
    Else
        $sTreeViewItemPathAttrib = FileGetAttrib($sTreeViewItemPath)
        If StringInStr($sTreeViewItemPathAttrib, 'D') Then
            $sShellFileInfoFlags = BitOR($SHGFI_SMALLICON, $SHGFI_SYSICONINDEX)
        Else
            $sShellFileInfoFlags = BitOR($SHGFI_ICON, $SHGFI_OVERLAYINDEX, $SHGFI_USEFILEATTRIBUTES, $SHGFI_SMALLICON, $SHGFI_SYSICONINDEX)
        EndIf
        $tShellFileInfo = DllStructCreate($tagSHFILEINFO)
        $sSystemImageListHandle = _WinAPI_ShellGetFileInfo($sTreeViewItemPath, $sShellFileInfoFlags, 0, $tShellFileInfo)
        $sIconIndex = DllStructGetData($tShellFileInfo, 'iIcon')
        $sIconHandle = _GUIImageList_GetIcon($sSystemImageListHandle, $sIconIndex)
        If $sIconHandle <> 0 And StringInStr($sTreeViewItemPathAttrib, 'H') And StringRegExpReplace($sTreeViewItemPath, '\\+$', '') <> $sDrive Then $sIconHandle = _WinAPI_AddIconTransparency($sIconHandle, 50, True)
        If $sIconHandle <> 0 Then
            $sImageListIconIndex = _GUIImageList_ReplaceIcon($sTreeViewImageListHandle, -1, $sIconHandle)
            _WinAPI_DestroyIcon($sIconHandle)
        Else
            $sIconIndex = 0
            If StringInStr(FileGetAttrib($sTreeViewItemPath), 'D') Then $sIconIndex = 4
            $sImageListIconIndex = _GUIImageList_AddIcon($sTreeViewImageListHandle, @SystemDir & '\shell32.dll', $sIconIndex)
        EndIf
    EndIf
    If $sImageListIconIndex = -1 Then Return SetError(4, 0, False)
    $sFuncReturn = _GUICtrlTreeView_SetImageIndex($sTreeViewHandle, $sTreeViewItemHandle, $sImageListIconIndex)
    If $sFuncReturn = False Then Return SetError(5, 0, False)
    Return True
EndFunc   ;==>_SetTreeViewItemIcon

Func _GetDriveLetterFromVolumeUnitMask($sVolumeUnitMask)
    $sDrivesList = ''
    For $i = 1 To 26
        If BitAND($sVolumeUnitMask, 0x1) Then $sDrivesList = $sDrivesList & Chr($i - 1 + Asc('A')) & ':|'
        $sVolumeUnitMask = BitShift($sVolumeUnitMask, 0x1)
    Next
    Return StringTrimRight($sDrivesList, StringLen('|'))
EndFunc   ;==>_GetDriveLetterFromVolumeUnitMask

Func _ProcessCheckedFiles()
    If Not IsDeclared('__CheckedTreeViewItemPaths') Then Global $__CheckedTreeViewItemPaths = ''
    Local $sDrive, $sDir, $sFilename, $sExtension
    If $__CheckedTreeViewItemPaths = '' Then
        MsgBox($MB_OK, 'Info', 'You have to check at least 1 file or folder before clicking ' & GUICtrlRead($CheckedFilesButton) & ' button.')
    Else
        $sCheckedTreeViewItemsPathList = StringSplit(StringRegExpReplace($__CheckedTreeViewItemPaths, '\R*$', ''), @CRLF, $STR_ENTIRESPLIT)
;~    _ArrayDisplay($sCheckedTreeViewItemsPathList)
        If StringRight(GUICtrlRead($FileRestorePath), 1) == "\" Then
            $path = StringTrimRight(GUICtrlRead($FileRestorePath), 1)
        Else
            $path = GUICtrlRead($FileRestorePath)
        EndIf
        If FileExists($path) = 0 Then
            DirCreate($path)
        EndIf
        If IsArray($sCheckedTreeViewItemsPathList) Then
            SplashTextOn("Copy Data", "", 500, 50, -1, -1)
            For $i = 1 To UBound($sCheckedTreeViewItemsPathList) - 1
                GUISetState(@SW_HIDE, $FileRestoreGui)
                $apath = StringSplit($sCheckedTreeViewItemsPathList[$i], "\")
                If $keepfullpath = 0 Then
                    If FileGetAttrib($sCheckedTreeViewItemsPathList[$i]) = "D" Then
                        $apath = StringSplit($sCheckedTreeViewItemsPathList[$i], "\")
                        DirCreate($path & "\" & $apath[2])
                        DirCopy($sCheckedTreeViewItemsPathList[$i], $path & "\" & $apath[2], 1)
                        ControlSetText("Copy Data", "", "Static1", "Copying Directory " & $sCheckedTreeViewItemsPathList[$i])
                        Sleep(100)
                    Else
                        $Dirpath = _StringBetween($sCheckedTreeViewItemsPathList[$i], $apath[1], StringTrimRight($apath[UBound($apath) - 1], 1))
                        DirCreate($path & "\" & $Dirpath[0])
                        FileCopy($sCheckedTreeViewItemsPathList[$i], $path & "\" & $Dirpath[0] & "\", 8 + $overwrite)
                        ControlSetText("Copy Data", "", "Static1", "Copying File " & $sCheckedTreeViewItemsPathList[$i])
                        Sleep(100)
                    EndIf
                EndIf
                If $keepfullpath = 1 Then
                    If FileGetAttrib($sCheckedTreeViewItemsPathList[$i]) = "D" Then
                        DirCreate($path & "\" & StringTrimRight($apath[1], 1) & "-Drive")
                        DirCopy($sCheckedTreeViewItemsPathList[$i], $path & "\" & StringTrimRight($apath[1], 1) & "-Drive" & "\" & $apath[2], 1)
                        ControlSetText("Copy Data", "", "Static1", "Copying Directory " & $sCheckedTreeViewItemsPathList[$i])
                        Sleep(100)
                    Else
                        $Dirpath = _StringBetween($sCheckedTreeViewItemsPathList[$i], $apath[1], StringTrimRight($apath[UBound($apath) - 1], 1))
                        DirCreate($path & "\" & StringTrimRight($apath[1], 1) & "-Drive" & $Dirpath[0])
                        FileCopy($sCheckedTreeViewItemsPathList[$i], $path & "\" & StringTrimRight($apath[1], 1) & "-Drive" & $Dirpath[0] & "\", 8 + $overwrite)
                        ControlSetText("Copy Data", "", "Static1", "Copying File " & $sCheckedTreeViewItemsPathList[$i])
                        Sleep(100)
                    EndIf
                EndIf
                $sTreeViewItemHandle = _GUICtrlTreeView_FindItemEx($FileExplorerTreeView, StringReplace($sCheckedTreeViewItemsPathList[$i], '\', Opt('GUIDataSeparatorChar')))
                If $sTreeViewItemHandle <> 0 Then _GUICtrlTreeView_SetChecked($FileExplorerTreeView, $sTreeViewItemHandle, False)
            Next
        EndIf
        $__CheckedTreeViewItemPaths = ''
    EndIf
    ControlSetText("Copy Data", "", "Static1", "Copying Complete")
    Sleep(2000)
    SplashOff()
    Exit
EndFunc   ;==>_ProcessCheckedFiles

Func GUI_Events_RestoreFile()
    Switch @GUI_CtrlId
        Case $GUI_EVENT_CLOSE

        Case $keeppath
            If GUICtrlRead($keeppath) = 1 Then
                $keepfullpath = 1
            EndIf
            If GUICtrlRead($keeppath) = 0 Then
                $keepfullpath = 0
            EndIf
        Case $SelRestoreFolder
            $fileRestorePathLocation = FileSelectFolder("Select restore location", "e:\")
            If $fileRestorePathLocation <> "" Then
            GUICtrlSetData($FileRestorePath, $fileRestorePathLocation)
            EndIf
        Case $Restore2New
            If GUICtrlRead($Restore2New) = 1 Then
                GUICtrlSetState($FileRestorePath, $GUI_DISABLE)
                GUICtrlSetState($SelRestoreFolder, $GUI_DISABLE)
            EndIf
            If GUICtrlRead($Restore2New) = 1 Then
                GUICtrlSetState($FileRestorePath, $GUI_ENABLE)
                GUICtrlSetState($SelRestoreFolder, $GUI_ENABLE)
            EndIf
        Case $OverWriteExisting
            If GUICtrlRead($OverWriteExisting) = 1 Then
                $overwrite = 1
            EndIf
            If GUICtrlRead($OverWriteExisting) = 0 Then
                $overwrite = 0
            EndIf
    EndSwitch
EndFunc   ;==>GUI_Events_RestoreFile

 

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
  • Recently Browsing   0 members

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