Работа с корзиной в Delphi.Функции оболочки ( ShellApi )

На форуме с завидным постоянством появляются вопросы, как мне отправить или удалить файл в корзину(Recycle Bin), этой статьей я хочу раз и навсегда закрыть эту "наболевшую тему", а может и открыть. Так же это статья открывает, новый проект нашего сайта DSDN.
Но как скажете Вы ближе к телу, простите делу…
Мне известно (возможно их больше) три функции для работы с корзиной в ShellApi:

SHFileOperation
SHEmptyRecycleBin
SHQueryRecycleBin

Функция SHFileOperation (объявлена и присутствует в модуле ShellApi) вообще предназначена не только для удаления файлов, но также еще для перемещение, копирования и переименования файлов, и мне можно было ограничиться только описанием ее возможностей только для работы с корзиной, но я опишу все ее функции.Функция объявлена как
SHFileOperation(const lpFileOp: TSHFileOpStruct): Integer;

Единственным ее параметром являеться структура TSHFileOpStruct .В случае успеха возвращает значение 0. Если вам нужно удалить файл напрямую, гарантировано минуя корзину используйте функцию DeleteFile .

TSHFileOpStruct структура используется для указания параметров функции .

Опишем ее поля:

Wnd
хэндл диалогового окна, отображающего статус операции;

wFunc
тип производимой операции:
FO_COPY
копировать файл.
FO_MOVE
переместить файл.
FO_DELETE
удалить файл.
FO_RENAME
переименовать файл.

pFrom
указатель на строку с именем исходного файла.

pTo
указатель на строку с именем файла, в который копируется, перемещается или переименовывается исходный файл.

fFlags
флаги определяющие параметры операции.
FOF_ALLOWUNDO
сохраняет информацию о возможной отмене операции.
FOF_FILESONLY
выполняет операцию только для файлов, если задана маска файлов.
FOF_MULTIDESTFILES
указывает, что pTo описывает несколько файлов (по одному на каждый файл источника) вместо одного каталога, куда должны быть помещены исходные файлы.
FOF_NOCONFIRMATION
отвечает "Да для всех" на все вопросы.
FOF_NOCONFIRMMKDIR
не требует подтверждения создания нового каталога.
FOF_NO_CONNECTED_ELEMENTS
С версии 5.0. Не перемещает связанные файлы как группу. Только перемещает указанные файлы
FOF_NOCOPYSECURITYATTRIBS
С версии 4.71. Не копирует атрибуты безопасности файла.
FOF_NOERRORUI
Не отображает пользовательский интерфейс при ошибке.
FOF_NORECURSION
Не поддерживает рекурсивные операции в подкаталогах, работает только в локальном каталоге.
FOF_RENAMEONCOLLISION
присваивает файлу новое имя при операциях копирования, перемещения или переименования, если файл с указанным именем уже существует.
FOF_SILENT
не показывает прогресс бар отображающий ход операции.
FOF_SIMPLEPROGRESS
отображает окно прогресс бара, но не показывает имен файлов.
FOF_WANTMAPPINGHANDLE
Определяет использование поля hNameMappings . Хендл объекта должен быть освобожден функцией SHFreeNameMappings . Она объявлена в ShellApi как процедура
SHFreeNameMappings(hNameMappings: THandle);

fAnyOperationsAborted
Принимает значение True если операция была прервана или False в ином случае.

hNameMappings
Хендл объекта содержащего массив структур SHNAMEMAPPING . Каждая структура SHNAMEMAPPING содержит старые и новые пути для каждого файла, с которым произведены операции перемещения, копирования, или переименования. Это поле используется, если установлен флаг FOF_WANTMAPPINGHANDLE .

lpszProgressTitle
указатель на строку заголовка для окна прогресса; используется только, если среди флагов есть FOF_SIMPLEPROGRESS

SHEmptyRecycleBin функция для очищения корзины на определенном диске(или на всех) , она не переведена в стандартном модуле ShellApi Delphi, поэтому вы можете воспользоваться моим переводом, либо перевести сами (все вышесказанное также справедливо и к функции SHQueryRecycleBin ).
Функция объявлена как
SHEmptyRecycleBin(Wnd:HWND; pszRootPath:PChar; dwFlags:DWORD):HRESULT;
где
hwnd
Handle родительского или диалогового окно которое может отображаться в течение операции . Этот параметр может быть равен нулю.

pszRootPath
Указатель на строку PChar содержащею путь к корневому диску на которая находиться корзина. Этот параметр может содержать адрес строки, с путем к какому-нибудь каталогу или подкаталогу, например c:\windows\system... . Это может также содержать пустую строку или Nil . Если это значение - пустая строка или Nil , все корзины на всех дисках будут очищены.

dwFlags
Может содержать один или несколько параметров из следующих
SHERB_NOCONFIRMATION
Не показывать диалог подтверждения удаления всех файлов из корзины.
SHERB_NOPROGRESSUI
Не показывать прогресс бар отображающий удаление файлов из корзины.
SHERB_NOSOUND
Не подтверждать завершение удаление звуковым сигналом.

SHQueryRecycleBin эта функция возвращает размер корзины и количество элементов в ней на определенном диске.
Она объявлена как
SHQueryRecycleBin(pszRootPath:PANSIChar; var SHQueryRBInfo:TSHQueryRBInfo):HRESULT;
Где
pszRootPath
Указатель на строку PChar содержащею путь к корневому диску на которая находиться корзина. Этот параметр может содержать адрес строки, с путем к какому-нибудь каталогу или подкаталогу, например c:\windows\system... .
В Windows 2000, если в параметре pszRootPath пустое значение или Nil , функция возвращают ошибку E_INVALIDARG . Более ранние версии операционной системы позволяют передавать пустую строку или Nil . Если pszRootPath содержит пустую строку или Nil , информация возвращается для всех корзин на всех дисках.

PSHQueryRBInfo
Указатель на структуру SHQUERYRBINFO , которая получает информацию о корзине. Значение поле структуры CbSize должно быть установлено равным размеру структуры перед запросом этой функции.
Объявление этой структуры
TSHQueryRBInfo = packed record
cbSize : DWORD;
i64Size,
i64NumItems : TLargeInteger;
end;

А вот описание полей

cbSize
Размер структуры, в байтах. Повторюсь, это поле должно быть заполнено до вызова функции.

I64Size
Полный размер всех элементов в указанной корзине, в байтах.

I64NumItems
Общее количество элементов в указанной корзине.

Примеры к статье (небольшой набросок вместе с заголовком необъявленых функций). Может они не слишком сложные, но поймите правильно, я не задавался целью написать очередной файловый менеджер, и время было потрачено около двух часов, а разобраться я думаю вы сможете и сами, и может напишите очередной WindowsCommander 8-)), но будут ли им пользоваться??? Еще я использовал там несколько других функций оболочки, но о них в другой раз...

Но вот и все...

В статье использованы материалы из Microsoft SDK.

С удовольствием выслушаю все комментария и замечания по поводу данной статьи. Сразу хочу предупредить, я не отвечаю на письма где меня просят выслать что либо или будет ли продолжение(и подобные письма не несущие какой-то содержательной части), я их читаю, но отвечать на них у меня времени нет. Также , если кто обнаружит неточности, да и просто грамматические ошибки в статье, за это прошу заранее извинение.

Hosted by uCoz