Как использовать IFileOperation CopyItems для конечного ZIP-файла

Я использую метод 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;
}

2

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector