Я использую метод CopyItems интерфейса IFileOperation для копирования еще одного файла из исходной папки в папку назначения. Это работает без каких-либо ошибок, если папка назначения является стандартным каталогом файловой системы. Тем не менее, моя основная мотивация использования IFileOperation вместо метода SHFileOperation () состоит в том, чтобы разрешить копирование элементов из / в объекты не файловой системы, как сказано в документации (https://msdn.microsoft.com/en-us/library/windows/desktop/bb775771%28v=vs.85%29.aspx).
Следующий код прекрасно работает для назначения файловой системы, например «g: \ my folder», но не работает, если местом назначения является ZIP-файл, например «g: \ Super Cars.zip». Для этого быстрого примера просмотрите утечки ресурсов :).
Обратите внимание, что ZIP-файл — это существующий ZIP-файл, созданный с использованием стандартной встроенной функции ZIP в Windows, и он не содержит файл, который я пытаюсь скопировать.
#include "stdafx.h" #include <Windows.h> #включают <shellapi.h> #включают <shlobj.h> #включают <iostream> #включают <atlbase.h> void CopyFile (LPCTSTR strSource, LPCTSTR strDestination) { PIDLIST_ABSOLUTE abSourcePidl = nullptr; Аттрибуты SFGAOF; HRESULT hr = SHParseDisplayName (strSource, nullptr, &abSourcePidl, 0, &ATTRS); если (СБОЙ (час)) { станд :: wcout << _T («Ошибка SHParseDisplayName для») << strSource << станд :: епсИ; вернуть; } PIDLIST_ABSOLUTE abDestPidl = nullptr; hr = SHParseDisplayName (strDestination, nullptr, &abDestPidl, 0, &ATTRS); если (СБОЙ (час)) { станд :: wcout << _T («Ошибка SHParseDisplayName для») << strDestination << станд :: епсИ; вернуть; } IShellItem2 * pDestShellItem; hr = SHCreateItemFromIDList (abDestPidl, IID_IShellItem2, reinterpret_cast<LPVOID *>(&pDestShellItem)); если (СБОЙ (час)) { станд :: wcout << _T («Ошибка SHCreateItemFromIDList») << станд :: епсИ; вернуть; } PIDLIST_ABSOLUTE * pPidlRawArray = new PIDLIST_ABSOLUTE [1]; pPidlRawArray [0] = abSourcePidl; IShellItemArray * pShellItemArr = nullptr; hr = SHCreateShellItemArrayFromIDLists (1, (LPCITEMIDLIST *) pPidlRawArray, &pShellItemArr); если (СБОЙ (час)) { станд :: wcout << _T («Ошибка SHCreateShellItemArrayFromIDLists») << станд :: епсИ; вернуть; } CComPtr<IFileOperation> файловые операции; hr = fileOp.CoCreateInstance (CLSID_FileOperation); если (СБОЙ (час)) { станд :: wcout << _T («Не удалось создать IFileOperation») << станд :: епсИ; вернуть; } hr = fileOp->CopyItems (pShellItemArr, pDestShellItem); если (СБОЙ (час)) { станд :: wcout << _T («Ошибка копирования CopyItems») << станд :: епсИ; вернуть; } hr = fileOp->PerformOperations (); если (СБОЙ (час)) { станд :: wcout << _T («Ошибка вызова PerformOperations») << станд :: епсИ; вернуть; } станд :: wcout << _T («Файл успешно скопирован») << станд :: епсИ; } int _tmain (int argc, _TCHAR * argv []) { CoInitialize (NULL); CopyFile (_T ("D: \\ TEMP \\ COMTIME.TXT"), _T ("G: \\ Моя папка")); // РАБОТАЕТ!! CopyFile (_T ("D: \\ TEMP \\ COMTIME.TXT"), _T ("G: \\ Super Cars.zip")); // НЕ РАБОТАЕТ!! CoUninitialize (); вернуть 0; }
Задача ещё не решена.