cgmiapapi Posted November 22, 2020 Posted November 22, 2020 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. expandcollapse popup#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
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