Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Восстановление файла из корзины 
:(
    Опции темы
Poseidon
Дата 19.5.2005, 03:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 10
Всего: 133



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



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0390 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.