Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

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

Delphi , Файловая система , Корзина

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

Code:

// Функция восстанавливает выбранный в 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;

Автор: Rouse_

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

Вот перевод текста на русский язык:

Это фрагмент кода Delphi, который предназначен для восстановления файла из корзины Windows с помощью API Windows Shell.

Сюда включены детали о том, что код делает:

  1. Функция RestoreElement принимает два параметра: AHandle (указатель на текущий процесс) и LV (ссылка на объект TListView).
  2. Функция сначала проверяет, является ли параметр LV валидным.
  3. Затем она устанавливает различные интерфейсы COM, включая IShellFolder, IShellFolder2, IEnumIDList, IMalloc и IContextMenu.
  4. Функция привязывает папку корзины к интерфейсу RecycleBin с помощью методов SHGetSpecialFolderLocation и Desktop.BindToObject.
  5. Затем она перечисляет содержимое корзины с помощью метода RecycleBin.EnumObjects, который возвращает интерфейс IEnumIDList.
  6. Функция перебирает перечисленные элементы, проверяя, соответствует ли каждый из них выбранному элементу в контроле ListView с помощью функции GetLVItemText. Если найден совпадение, она пытается восстановить файл с помощью интерфейса IContextMenu.

Обработчик события mnuRestoreClick вызывается при клике на пункт меню "Восстановить". Он вызывает функцию RestoreElement с указателем на текущий процесс и контролем ListView как параметрами, а затем отображает сообщение, если восстановление было успешным.

Некоторые предложения по улучшению кода:

  • Используйте более описательные имена переменных, чтобы сделать код более понятным.
  • Рассмотрите добавление обработки ошибок для случаев, когда интерфейсы COM или методы не работают.
  • Вам может потребоваться добавить дополнительные проверки, чтобы убедиться, что выбранный элемент в контроле ListView является валидным и представляет файл, который можно восстановить из корзины.

Альтернативное решение - использовать функцию ShellExecute, чтобы восстановить файл напрямую без использования интерфейса IContextMenu. Это может быть более простым подходом, но он может не обеспечивать такой же уровень настройки и контроля, как оригинальный код.

Вот пример простого кода:

procedure TForm1.mnuRestoreClick(Sender: TObject);
begin
  if ListView1.Selected <> nil then
    ShellExecute(0, 'undelete', PChar(ListView1.SelectedItem.Caption), nil, nil, SW_SHOWNORMAL) := S_OK;
end;

Обратите внимание, что это код assumes, что файл хранится в корзине и может быть восстановлен с помощью функции ShellExecute. Вам может потребоваться добавить дополнительные проверки или обработку ошибок в зависимости от вашего конкретного требования.

Функция восстанавливает выбранный элемент списка из корзины и выполняет соответствующие действия, такие как восстановление файла или открытие его свойства.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Корзина ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2024-12-27 01:58:36/0.0036160945892334/0