Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
 

Функции оболочки ( ShellApi )

Работа с корзиной в Delphi

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

скачать(4,679 байт)

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

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

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

   Внимание! Запрещается перепечатка данной статьи или ее части без согласования с автором. Если вы хотите разместить эту статью на своем сайте или издать в печатном виде, свяжитесь с автором.
Автор статьи:  lel
  

Другие статьи Наверх


  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо