Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Восстановление файла из корзины

01.01.2007

// Функция восстанавливает выбранный в ListView элемент из корзины...
function RestoreElement(const AHandle: THandle; LV: TListView): Boolean;
 
 
function GetLVItemText(const Index: Integer): String;
 
begin
   
if Index = 0 then
     
Result := LV.Selected.Caption
   
else
     
Result := LV.Selected.SubItems.Strings[Index - 1];
 
end;
 
var
  ppidl
, Item: PItemIDList;
 
Desktop: IShellFolder;
 
RecycleBin: IShellFolder2;
 
RecycleBinEnum: IEnumIDList;
 
Fetched, I: Cardinal;
 
Details: TShellDetails;
 
Mallok: IMalloc;
 
Valid: Boolean;
 
Context: IContextMenu;
 
AInvokeCommand: TCMInvokeCommandInfo;
begin
 
Result := False;
 
if LV = nil then Exit;
 
if SHGetMalloc(Mallok) = S_OK then
   
if SHGetSpecialFolderLocation(AHandle, CSIDL_BITBUCKET, ppidl) = S_OK then
     
if SHGetDesktopFolder(Desktop) = S_OK then
       
if Desktop.BindToObject(ppidl, nil, IID_IShellFolder2, RecycleBin) = S_OK then
         
if RecycleBin.EnumObjects(AHandle,
            SHCONTF_FOLDERS
or SHCONTF_NONFOLDERS or SHCONTF_INCLUDEHIDDEN, RecycleBinEnum) = S_OK  then
         
begin
           
// Перечиляем содержимое корзины
           
while True do
           
begin
             
RecycleBinEnum.Next(1, Item, Fetched);
             
if Fetched = 0 then Break;
             
Valid := False;
             
for I := 0 to DETAIL_COUNT - 1 do
               
if RecycleBin.GetDetailsOf(Item, I, Details) = S_OK then
               
try
                 
// Ищем нужный нам элемент
                 
Valid := GetLVItemText(I) = StrRetToString(Item, Details.str);
                 
if not Valid then Break;
               
finally
                 
Mallok.Free(Details.str.pOleStr);
               
end;
             
// Если выделенный элемент найден
             
if Valid then
             
begin
               
// Восстанавливаем его при помощи интерфейса IContextMenu
               
if RecycleBin.GetUIObjectOf(AHandle, 1, Item,
                  IID_IContextMenu
, nil, Pointer(Context)) = S_OK then
               
begin
                 
FillMemory(@AInvokeCommand, SizeOf(AInvokeCommand), 0);
                 
with AInvokeCommand do
                 
begin
                    cbSize
:= SizeOf(AInvokeCommand);
                    hwnd
:= AHandle;
                   
// - локализация не нужна...
                    lpVerb
:= 'undelete'; // - восстановление фийла из корзины...
                   
//lpVerb := 'properties'; // - показ диалога свойства...
                   
//lpVerb := 'delete'; // - удаление файла из корзины...
                    fMask
:= 0;
                    lpDirectory
:= PChar(LV.Selected.SubItems.Strings[0]);
                    nShow
:= SW_SHOWNORMAL;
                 
end;
                 
Result := Context.InvokeCommand(AInvokeCommand) = S_OK;
                 
Break;
               
end;
             
end;
           
end;
         
end;
end;
 
procedure TForm1
.mnuRestoreClick(Sender: TObject);
begin
 
if ListView1.Selected <> nil then
   
if RestoreElement(Handle, ListView1) then ShowMessage('Элемент успешно восстановлен.');
end;

Пример работы с корзиной можно скачать здесь:

 

rbin.zip

Автор: Rouse_

Взято из https://forum.sources.ru