Программное удаление файла в Корзину
Небольшой сниппет - удаление файла или группы файлов в Корзину. Делается это при помощи функции 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", а затем удаляют его в Корзину разными способами.
Просмотров: 1208 | Комментариев: 6
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(14.05.2024 в 15:16):
Так для каждого удаляемого файла надо заполнять элемент массива pidl, он же не автоматически всей пачкой заполняется. Тут https://forum.sources.ru/index...topic=366720 не совсем в тему, но принцип тот же.
assch
(14.05.2024 в 14:35):
у метода (ParseDisplayName) интерфейса - IShellFolder
прописываю (6) параметров --> NULL,0,адрес символов первого файла,0,addr pidl,NULL
всё равно возвращает только один идентификатор в - pidl
прописываю (6) параметров --> NULL,0,адрес символов первого файла,0,addr pidl,NULL
всё равно возвращает только один идентификатор в - pidl
assch
(14.05.2024 в 12:25):
Большое спасибо,попробую разобраться
ManHunter
(14.05.2024 в 10:57):
https://learn.microsoft.com/en...-deleteitems
Единственным параметром передается список объектов в формате IShellItemArray, IDataObject или IEnumShellItems. И на каждый из этих списков добавится еще по три экрана кода, чтобы его создать.
Вкратце: создается массив ITEMIDLIST https://firststeps.ru/cbuilder/r.php?80= , дальше через SHCreateShellItemArrayFromIDLists создается объект IShellItemArray, затем он передается в DeleteItems.
"попробывать", "Не подскажите" - за что так с русским языком? :(
и еще вот [,,,,,,,,,......] коробочка со знаками препинания, а то потерялись где-то по дороге. Читать невозможно.
Единственным параметром передается список объектов в формате IShellItemArray, IDataObject или IEnumShellItems. И на каждый из этих списков добавится еще по три экрана кода, чтобы его создать.
Вкратце: создается массив ITEMIDLIST https://firststeps.ru/cbuilder/r.php?80= , дальше через SHCreateShellItemArrayFromIDLists создается объект IShellItemArray, затем он передается в DeleteItems.
"попробывать", "Не подскажите" - за что так с русским языком? :(
и еще вот [,,,,,,,,,......] коробочка со знаками препинания, а то потерялись где-то по дороге. Читать невозможно.
assch
(14.05.2024 в 09:42):
Хороший метод только жалко что он сможет удалить только один файд
например если перетащить в окно группу файлов то сообщение - WM_DROPFILES
вернёт в параметре (wParam) дескриптор внутренней структуры
в этой структуре первым параметром прописано смещение
на символьные пути файла или файлов в формате - UNICODE
например если удалять без интерфейса
mov eax,wParam
mov eax,dword ptr [eax]
add eax,dword ptr [eax]
mov sfs.pFrom,eax ; адрес символов файлов в формате - UNICODE
invoke SHFileOperationW,addr sfs ; соответственно только функция - UNICODE
invoke DragFinish,wParam ; освободим память выделенную системой
Работает на ура выше всяких похвал
но ради интереса хочется попробывать интерфейсом
и вот если скормить этот адрес путей файлов
функции - SHCreateItemFromParsingName
то благополучно переместится в корзину только один файл видимо первый в списке
а вот как сделать чтобы все файлы ушли в корзину
в интерфейсе - IFileOperation
помимо метода - DeleteItem
есть ещё и метод - DeleteItems
но вот как его реализовать не пойму
кручу верчу ничего не получается
Не подскажите
например если перетащить в окно группу файлов то сообщение - WM_DROPFILES
вернёт в параметре (wParam) дескриптор внутренней структуры
в этой структуре первым параметром прописано смещение
на символьные пути файла или файлов в формате - UNICODE
например если удалять без интерфейса
mov eax,wParam
mov eax,dword ptr [eax]
add eax,dword ptr [eax]
mov sfs.pFrom,eax ; адрес символов файлов в формате - UNICODE
invoke SHFileOperationW,addr sfs ; соответственно только функция - UNICODE
invoke DragFinish,wParam ; освободим память выделенную системой
Работает на ура выше всяких похвал
но ради интереса хочется попробывать интерфейсом
и вот если скормить этот адрес путей файлов
функции - SHCreateItemFromParsingName
то благополучно переместится в корзину только один файл видимо первый в списке
а вот как сделать чтобы все файлы ушли в корзину
в интерфейсе - IFileOperation
помимо метода - DeleteItem
есть ещё и метод - DeleteItems
но вот как его реализовать не пойму
кручу верчу ничего не получается
Не подскажите
ManHunter
(26.08.2020 в 16:37):
Добавил реализацию удаления через COM-объекты. Архив обновлен.
Добавить комментарий
Заполните форму для добавления комментария