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