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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Копирование файлов из корзины(Recycle Bin), копирование из корзины в любое место 
V
    Опции темы
svl42
Дата 6.2.2009, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 28.10.2007

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



Привет Всем. Не сталкивался ли кто с данной задачей? Интересует именно копирование а не восстановление. Возможно ли это сделать через Api?
PM MAIL   Вверх
Rrader
  Дата 6.2.2009, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 29
Всего: 191



Теоретическая часть:
Как программно использовать Корзину
Как Корзина хранит файлы
Вторую прочитать обязательно. 

А теперь о проблеме. Сам Shell поддерживает только вырезку, с переименованием "на лету". Соответственно, чтобы скопировать, нужно либо переименовывать в самой корзине (где INFO лежит) и потом копировать, либо копировать и потом переименовывать (т.е. наоборот). Получить имена исходного и удаленного файла возможно, хотя и не очень очевидным способом.

Накидал пример, в котором идет перечисление всех объектов, находящихся в корзине. Показываются сообщения - пара путей доступа (исходный и удалённый) для каждого перечисляемого объекта. Далее самостоятельно.
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ShlObj, ShellAPI, ActiveX;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

function StrRetToStrW(pstr: PStrRet; const pidl: PItemIdList;
  out ppszName: PWideChar): HRESULT; stdcall; external 'shlwapi.dll';

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  { Recycle Bin ID }
  ID: PItemIDList;
  { Shell Allocator }
  Malloc: IMalloc;
  { Desktop IShellFolder }
  Desktop: IShellFolder;
  { Recycle Bin IShellFolder2 }
  Bin: IShellFolder2;
  { Recycle Bin Object Enumerator }
  Enum: IEnumIDList;
  { Recycle Bin Current File }
  BinFile: PItemIDList;  
  { Displaced Filename - Ater Deletion ; Restored Filename - Before Deletion }
  DisplacedName, RestoredName: TStrRet;
  { String Representation }
  SDisplacedName, SRestoredName: WideString;
  Buffer: PWideChar;
begin
  if Succeeded(CoGetMalloc(1, Malloc)) then
    if Succeeded(SHGetSpecialFolderLocation(Handle, CSIDL_BITBUCKET, ID)) then
    try
      if Succeeded(SHGetDesktopFolder(Desktop)) then
        if Succeeded(Desktop.BindToObject(ID, nil, IID_IshellFolder2, Bin)) then
          if Succeeded(Bin.EnumObjects(Handle, SHCONTF_NONFOLDERS or
            SHCONTF_INCLUDEHIDDEN or SHCONTF_FOLDERS, Enum)) then
            while Enum.Next(1, BinFile, PULONG(nil)^) = S_OK do
            try
              { Displaced Path }
              if Succeeded(Bin.GetDisplayNameOf(BinFile, SHGDN_FORPARSING,
                DisplacedName)) then
              begin
                SetLength(SDisplacedName, MAX_PATH);
                if Succeeded(StrRetToStrW(@DisplacedName, BinFile, Buffer)) then
                try
                  SDisplacedName := Buffer;
                finally
                  CoTaskMemFree(Buffer);
                end;
              end;
              { Restored Path }
              if Succeeded(Bin.GetDisplayNameOf(BinFile, 0,
                RestoredName)) then
              begin
                SetLength(SRestoredName, MAX_PATH);
                if Succeeded(StrRetToStrW(@RestoredName, BinFile, Buffer)) then
                try
                  SRestoredName := Buffer;
                finally
                  CoTaskMemFree(Buffer);
                end;
              end;
              ShowMessage('До: ' + SRestoredName + sLineBreak +
                'После: ' + SDisplacedName);
            finally
              Malloc.Free(BinFile);
            end;
    finally
      Malloc.Free(ID);
    end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  CoInitialize(nil);
end;

end.


P.S.
Windows Vista (7) немножко более чувствительны ко второму параметру GetDisplayNameOf, нежели Windows XP smile  Если указать 0, то возвращаемый путь не всегда будет с расширением (ситуация как и в Проводнике - если тип файла не зарегистрирован, расширение НЕ опускается).


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
svl42
Дата 6.2.2009, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 28.10.2007

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



Огромнейшее вам спасибо! за столько содержательный ответ, это как раз то что нужно.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.

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


 




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


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

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