ShellExecute ("::{645FF040-5081-101B-9F08-00AA002F954E}")
Похоже вопрос не так уж прост. Давно не могу найти решение.El Panda сказал(а):Как вариант скопировать его обратно из папки RECYCLER нужного диска, вопрос только в том как определить конкретный файл.
Но вроде как там есть файл индексов...
D:\RECYCLER\S-1-5-21-842925246-1844823847-682003330-1003
C:\$Recycle.Bin\S-1-5-21-4132900103-3613051719-553855155-1001
У меня Виста :Вот незадача только с выпуском системы. Если это XP, то создает папку
C:\$Recycle.Bin\S-1-5-21-740529958-3378912036-438458945-1000
C:\$Recycle.Bin\S-1-5-21-51003140-4199384537-3980697693-500
Удаленные файлы имеют другое название, и пути восстановления с оригинальным названием файлов лежат в бинарном файле INFO2 ( это в ХР ) так, что не знаю, что это даст. ИМХОПочему бы не просканировать все диски с папками RECYCLER на наличие данного файла?
#Include <Array.au3>
#Include <GUIListView.au3>
$Name = RegRead('HKCR\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}', '')
ShellExecute('::{645FF040-5081-101B-9F08-00AA002F954E}', '', '', '', @SW_HIDE)
If Not WinWait($Name, '', 3) Then
MsgBox(16, 'Error', 'Error!')
Exit
EndIf
$hWnd = WinGetHandle($Name)
$hList = ControlGetHandle($Name, '', 'SysListView321')
$Count = _GUICtrlListView_GetItemCount($hList)
Dim $Data[$Count + 1][2]
$Data[0][0] = 'Name'
$Data[0][1] = 'Original Location'
For $i = 1 To $Count
For $j = 0 To 1
$Data[$i][$j] = _GUICtrlListView_GetItemText($hList, $i - 1, $j)
Next
Next
WinClose($hWnd)
_ArrayDisplay($Data)
Если нет других решений ,то можноПервое, что приходит на ум, это работать непосредственно с окном корзины.
Но что дальше ? Неужели кликать по элементам окна ?
_GUICtrlListView_SetItemSelected($hList, $Index, 1, 1)
_SendMessage($hWnd, $WM_COMMAND, $ID_Restore, 0)
ConsoleWrite(_FileRecycleRestore(@DesktopDir, "~~Wiki.jpg"))
Func _FileRecycleRestore($sSourcePath, $sFileName)
Local Const $RECYCLE_BIN = 10
Local $objShell, $objFolder, $objFolderItem, $colItems
$objShell = ObjCreate("Shell.Application")
$objFolder = $objShell.Namespace($RECYCLE_BIN)
$objFolderItem = $objFolder.Self
$colItems = $objFolder.Items
If IsObj($objShell) And Not @error Then
For $objItem In $colItems
$sName = $objFolder.GetDetailsOf($objItem, 0)
$sSrcPath = $objFolder.GetDetailsOf($objItem, 1)
If $sSrcPath = $sSourcePath And $sName = $sFileName Then
$objFolderItem.InvokeVerbEx("Восстановить", $sSrcPath & "\" & $sName)
Return FileCopy($objFolderItem.Path & "\" & $sName, $sSrcPath & "\" & $sName)
EndIf
;~ $objFolder.GetDetailsOf($objItem, Number...)
;~ 0 Name: dvdsig.md5
;~ 1 Original Location: C:\VISTAG\D1
;~ 2 Date Deleted: 3/20/2007 6:54 PM
;~ 3 Size: 32 KB
;~ 4 Type: MD5 File
;~ 5 Date Modified: 3/20/2007 6:02 PM
;~ 6 Date Created: 3/20/2007 5:59 PM
;~ 7 Date Accessed: 3/20/2007 12:00 AM
;~ 8 Attributes: A
;~ 9 Status: Online
;~ 10 Owner: Everyone
;~ 11 Author:
;~ 12 Title:
;~ 13 Subject:
;~ 14 Category:
;~ 15 Pages:
;~ 16 Comments:
;~ 17 Copyright:
;~ 18 Artist:
;~ 19 Album Title:
;~ 20 Year:
;~ 21 Track Number:
;~ 22 Genre:
;~ 23 Duration:
;~ 24 Bit Rate:
;~ 25 Protected:
;~ 26 Camera Model:
;~ 27 Date Picture Taken:
;~ 28 Dimensions:
;~ 29 :
;~ 30 :
;~ 31 Episode Name:
;~ 32 Program Description:
;~ 33 :
Next
EndIf
Return SetError(1, 0, -1)
EndFunc
Т.е. выделяешь нужный файл ($Index), затем меню Restore ($ID_Restore). Значение $ID_Restore можно посмотреть в любом редакторе ресурсов (к сожалению нет под рукой) или в Google.
_GUICtrlListView_SetItemSelected($hList, 1, 1, 1)
GUICtrlListView_GetSelectedIndices($hList)
$ID_Restore=101
_SendMessage($hWnd, $WM_COMMAND, $ID_Restore, 0)
но оно не работает, есть мысли на этот счёт?
А как определить нужный файл ( файл , который был только что удален)?
Почему у меня не получается проверить выделение с помощью?
#Include <Array.au3>
#Include <GUIListView.au3>
$Name = RegRead('HKCR\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}', '')
ShellExecute('::{645FF040-5081-101B-9F08-00AA002F954E}', '', '', '', @SW_HIDE)
If Not WinWait($Name, '', 3) Then
MsgBox(16, 'Error', 'Error!')
Exit
EndIf
$hWnd = WinGetHandle($Name)
$hList = ControlGetHandle($Name, '', 'SysListView321')
$Count = _GUICtrlListView_GetItemCount($hList)
Dim $Data[$Count + 1][3]
$Data[0][0] = 'Name'
$Data[0][1] = 'Original Location'
$Data[0][2] = 'Date Deleted'
For $i = 1 To $Count
For $j = 0 To 2
$Data[$i][$j] = _GUICtrlListView_GetItemText($hList, $i - 1, $j)
Next
Next
_GUICtrlListView_SetItemSelected($hList, 1, 1, 1)
ConsoleWrite(_GUICtrlListView_GetSelectedIndices($hList) & @CR)
WinClose($hWnd)
_ArrayDisplay($Data)
вообще не удается?
_GUICtrlListView_SetItemSelected($hList, 1, 1, 1)
WinClose($hWnd)
Значит ID не тот.
Это не везде будет работать, если пользователь сменил название у корзины, то заголовок будет другим. Есть ещё вот это:$Name = RegRead('HKCR\CLSID\{645FF040-5081-101B-9F08-00AA002F954E}', '')
$Iabcdef.ext ; вспомогательныйфайл
$Rabcdef.ext ; оригинальный файл
#Include <Array.au3>
#include <File.au3>
Global $sRezultat
$hFile =@ScriptDir & '\Test - Copy.txt' ; удаляемый файл
$iTime=FileGetTime ($hFile,0 ,1)
FileRecycle($hFile)
$hDisc=StringLeft ( $hFile, 2 )
$sFolder=$hDisc & '\$Recycle.Bin'
$sFind=_FindFiles($sFolder, '*.*' )
$aFind=StringSplit (StringTrimRight ( $sFind, 1 ) , '|' )
;_ArrayDisplay($aFind)
For $i=1 To UBound($aFind)-1
If Not StringInStr ( $aFind[$i],'$R') Then ContinueLoop
If FileGetTime ( $aFind[$i],0,1) = $iTime Then ExitLoop
Next
$iProc=FileCopy($aFind[$i],$hFile)
If $iProc=1 Then MsgBox(0,'',"Файл восстановлен",1 )
Func _FindFiles($sRoot, $sFile)
; By Yashied
Local $FileList
$FileList = _FileListToArray($sRoot, $sFile, 1)
If Not @error Then
For $i = 1 To $FileList[0]
$sRezultat &= $sRoot & '\' & $FileList[$i] & '|'
Next
EndIf
$FileList = _FileListToArray($sRoot, '*', 2)
If Not @error Then
For $i = 1 To $FileList[0]
_FindFiles($sRoot & '\' & $FileList[$i], $sFile)
Next
EndIf
Return $sRezultat
EndFunc ;==>_FindFiles
$Iabcdef.ext ; вспомогательныйфайл имеет дату появления в корзине
$Rabcdef.ext ; оригинальный файл имеет оригинальную дату создания
#Include <Array.au3>
#include <File.au3>
Global $sRezultat,$iTime, $ii
$hFile =@ScriptDir & '\Test - Copy.txt' ; удаляемый файл
FileRecycle($hFile)
;MsgBox(0,'','')
$hDisc=StringLeft ( $hFile, 2 )
$sFolder=$hDisc & '\$Recycle.Bin'
$sFind=_FindFiles($sFolder, '*.*' )
$aFind=StringSplit (StringTrimRight ( $sFind, 1 ) , '|' )
;_ArrayDisplay($aFind)
For $i=1 To UBound($aFind)-1
If Not StringInStr ( $aFind[$i],'$I') Then ContinueLoop
If FileGetTime ( $aFind[$i],0,1) > $iTime Then $ii=$i
$iTime=FileGetTime ( $aFind[$i],0 ,1)
Next
$sFile=StringReplace ( $aFind[$ii], "$I","$R")
$iProc=FileCopy($sFile,$hFile)
If $iProc=1 Then MsgBox(0,'',"Файл восстановлен",1 )
;..................Func _FindFiles ........
На XP не работает, т.к нет папки $Recycle.Bin. А даже если указать правильный путь, файл оттуда не копируется.Просьба потестировать
Как это будет на XP или 7 не знаю
Странно. На Висте нормально копируется???На XP не работает, т.к нет папки $Recycle.Bin. А даже если указать правильный путь, файл оттуда не копируется.
$strSpecialFolderName = "Recycle Bin"
$objRecycleBin = GetSpecialFolderObject($strSpecialFolderName)
; Get Special Folder based upon input name
$objFolderItems = $objRecycleBin.Items() ; Get items within Recycle Bin
For $objItem In $objFolderItems ; Delete all items within Special Folder
If ($objItem.Type = "File Folder") Then ; Check for file type
ConsoleWrite("Directory:")
Else
ConsoleWrite("File:")
EndIf
ConsoleWrite("Name=" & $objItem.Name & @CRLF)
ConsoleWrite("Size=" & $objItem.Size & @CRLF)
ConsoleWrite("recyclename:" & $objItem.Path & @CRLF)
ConsoleWrite(@CRLF)
Next
; Returns SpecialFolder based upon name of folder
Func GetSpecialFolderObject($NameOfFolder)
Local $objShellApp = ObjCreate("Shell.Application")
For $i = 0 To 40 ;40 is highest value for special folders
$objSpecialFolder = $objShellApp.NameSpace($i)
If $objSpecialFolder.Title = $NameOfFolder Then
Return $objSpecialFolder
EndIf
Next
Return
EndFunc ;==>GetSpecialFolderObject
Неа...На XP вроде работает
The requested action with this object has failed.:
If $objSpecialFolder.Title = $NameOfFolder Then
If $objSpecialFolder.Title ^ ERROR