
Программное удаление файла в Корзину
Небольшой сниппет - удаление файла или группы файлов в Корзину. Делается это при помощи функции SHFileOperation, но сперва нам надо будет определить необходимую структуру SHFILEOPSTRUCT и несколько констант.Code (Assembler) : Убрать нумерацию
- struct SHFILEOPSTRUCT
- hwnd dd ?
- wFunc dd ?
- pFrom dd ?
- pTo dd ?
- fFlags dw ?
- fAnyOperationsAborted dd ?
- hNameMappings dd ?
- lpszProgressTitle dd ?
- ends
- FO_DELETE = 3h
- FOF_ALLOWUNDO = 40h
- FOF_NOCONFIRMATION = 10h
- FOF_SILENT = 4h
Code (Assembler) : Убрать нумерацию
- mov [fos.hwnd],HWND_DESKTOP
- mov [fos.wFunc],FO_DELETE
- mov [fos.pFrom],fname
- mov [fos.fFlags],FOF_ALLOWUNDO+FOF_NOCONFIRMATION+FOF_SILENT
- invoke SHFileOperation,fos
Начиная с Windows Vista, файловые операции через функцию SHFileOperation считаются устаревшими, и Microsoft рекомендует использовать вместо них операции через COM-объекты. Неизбежно это тянет за собой тонну писанины: идентификаторы, интерфейсы, константы, достаточно объемный код реализации.
Code (Assembler) : Убрать нумерацию
- ; GUID {3AD05575-8857-4850-9277-11B85BDB8E09}
- CLSID_FileOperation dd 03AD05575h
- dw 08857h
- dw 04850h
- db 092h, 077h, 011h, 0B8h, 05Bh, 0DBh, 08Eh, 009h
- ; GUID {947AAB5F-0A5C-4C13-B4D6-4BF7836FC9F8}
- IID_IFileOperation dd 0947AAB5Fh
- dw 00A5Ch
- dw 04C13h
- db 0B4h, 0D6h, 04Bh, 0F7h, 083h, 06Fh, 0C9h, 0F8h
- ; GUID {43826D1E-E718-42EE-BC55-A1E261C37BFE}
- IID_IShellItem dd 043826D1Eh
- dw 0E718h
- dw 042EEh
- db 0BCh, 055h, 0A1h, 0E2h, 061h, 0C3h, 07Bh, 0FEh
- ; IID_IFileOperation Interface
- struct IFileOperationDispatch
- QueryInterface dd ?
- AddRef dd ?
- Release dd ?
- ; IFileOperation
- Advise dd ?
- Unadvise dd ?
- SetOperationFlags dd ?
- SetProgressMessage dd ?
- SetProgressDialog dd ?
- SetProperties dd ?
- SetOwnerWindow dd ?
- ApplyPropertiesToItem dd ?
- ApplyPropertiesToItems dd ?
- RenameItem dd ?
- RenameItems dd ?
- MoveItem dd ?
- MoveItems dd ?
- CopyItem dd ?
- CopyItems dd ?
- DeleteItem dd ?
- DeleteItems dd ?
- NewItem dd ?
- PerformOperations dd ?
- GetAnyOperationsAborted dd ?
- ends
- CLSCTX_INPROC_SERVER = 1
- S_OK = 0
Code (Assembler) : Убрать нумерацию
- ; Инициализировать COM-объект
- invoke CoInitialize,NULL
- ; Создать объект
- invoke CoCreateInstance,CLSID_FileOperation,NULL,\
- CLSCTX_INPROC_SERVER,\
- IID_IFileOperation,pIFoDisp
- cmp eax,S_OK
- jne loc_exit
- ; Установить флаги выполняемой операции
- mov eax, [pIFoDisp]
- mov eax, [eax]
- stdcall dword [eax+IFileOperationDispatch.SetOperationFlags],\
- [pIFoDisp],FOF_ALLOWUNDO+FOF_NOCONFIRMATION+FOF_SILENT
- ; Создать объект IShellItem из пути к файлу
- invoke SHCreateItemFromParsingName,filename,NULL,IID_IShellItem,\
- deleteItem
- ; Подготовить операцию удаления файла
- mov eax, [pIFoDisp]
- mov eax, [eax]
- stdcall dword [eax+IFileOperationDispatch.DeleteItem],\
- [pIFoDisp],[deleteItem],NULL
- ; Выполнить операцию
- mov eax, [pIFoDisp]
- mov eax, [eax]
- stdcall dword [eax+IFileOperationDispatch.PerformOperations],[pIFoDisp]
- ; Прибраться за собой
- mov eax, [pIFoDisp]
- mov eax, [eax]
- stdcall dword [eax+IFileOperationDispatch.Release],[pIFoDisp]
- ; Удалить объект
- invoke CoUninitialize
Если возможность восстановления не важна, то в остальных случаях для удаления файлов лучше все-таки использовать функцию DeleteFile.
В приложении примеры программ с исходными текстами, которые создают временный файл "test.txt", а затем удаляют его в Корзину разными способами.
Просмотров: 961 | Комментариев: 1

Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(26.08.2020 в 16:37):
Добавил реализацию удаления через COM-объекты. Архив обновлен.

Добавить комментарий
Заполните форму для добавления комментария
