Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何为目标ZIP文件使用IFileOperation CopyItems_C++_Windows_Shell_Visual C++_Desktop - Fatal编程技术网

C++ 如何为目标ZIP文件使用IFileOperation CopyItems

C++ 如何为目标ZIP文件使用IFileOperation CopyItems,c++,windows,shell,visual-c++,desktop,C++,Windows,Shell,Visual C++,Desktop,我正在使用IFileOperation接口的CopyItems方法将一个或多个文件从源文件夹复制到目标文件夹。只要目标文件夹是标准文件系统目录,这项操作就不会出错。但是,我使用IFileOperation而不是SHFileOperation()方法的主要动机是允许将项从非文件系统对象复制/复制到非文件系统对象中,如文档所述() 以下代码适用于文件系统目标,例如“g:\my folder”,但如果目标是ZIP文件,例如“g:\Super Cars.ZIP”,则不起作用。对于这个快速示例,请忽略资源

我正在使用IFileOperation接口的CopyItems方法将一个或多个文件从源文件夹复制到目标文件夹。只要目标文件夹是标准文件系统目录,这项操作就不会出错。但是,我使用IFileOperation而不是SHFileOperation()方法的主要动机是允许将项从非文件系统对象复制/复制到非文件系统对象中,如文档所述()

以下代码适用于文件系统目标,例如“g:\my folder”,但如果目标是ZIP文件,例如“g:\Super Cars.ZIP”,则不起作用。对于这个快速示例,请忽略资源泄漏:)

请注意,ZIP文件是使用Windows的标准内置ZIP功能创建的现有ZIP文件,它不包含我试图复制的文件

#include "stdafx.h" #include <Windows.h> #include <shellapi.h> #include <Shlobj.h> #include <iostream> #include <atlbase.h> void CopyFile(LPCTSTR strSource, LPCTSTR strDestination) { PIDLIST_ABSOLUTE abSourcePidl = nullptr; SFGAOF attrs; HRESULT hr = SHParseDisplayName(strSource, nullptr, &abSourcePidl, 0, &attrs); if (FAILED(hr)) { std::wcout << _T("SHParseDisplayName failed for ") << strSource << std::endl; return; } PIDLIST_ABSOLUTE abDestPidl = nullptr; hr = SHParseDisplayName(strDestination, nullptr, &abDestPidl, 0, &attrs); if (FAILED(hr)) { std::wcout << _T("SHParseDisplayName failed for ") << strDestination << std::endl; return; } IShellItem2* pDestShellItem; hr = SHCreateItemFromIDList(abDestPidl, IID_IShellItem2, reinterpret_cast<LPVOID*>(&pDestShellItem)); if (FAILED(hr)) { std::wcout << _T("SHCreateItemFromIDList failed") << std::endl; return; } PIDLIST_ABSOLUTE* pPidlRawArray = new PIDLIST_ABSOLUTE[1]; pPidlRawArray[0] = abSourcePidl; IShellItemArray* pShellItemArr = nullptr; hr = SHCreateShellItemArrayFromIDLists(1, (LPCITEMIDLIST*)pPidlRawArray, &pShellItemArr); if (FAILED(hr)) { std::wcout << _T("SHCreateShellItemArrayFromIDLists failed") << std::endl; return; } CComPtr<IFileOperation> fileOp; hr = fileOp.CoCreateInstance(CLSID_FileOperation); if (FAILED(hr)) { std::wcout << _T("Creation of IFileOperation failed") << std::endl; return; } hr = fileOp->CopyItems(pShellItemArr, pDestShellItem); if (FAILED(hr)) { std::wcout << _T("CopyItems fall failed") << std::endl; return; } hr = fileOp->PerformOperations(); if (FAILED(hr)) { std::wcout << _T("PerformOperations call failed") << std::endl; return; } std::wcout << _T("File copied successfully") << std::endl; } int _tmain(int argc, _TCHAR* argv[]) { CoInitialize(NULL); CopyFile(_T("D:\\TEMP\\COMTIME.TXT"), _T("G:\\My Folder")); // WORKS!! CopyFile(_T("D:\\TEMP\\COMTIME.TXT"), _T("G:\\Super Cars.zip")); // DOES NOT WORK!! CoUninitialize(); return 0; } #包括“stdafx.h” #包括 #包括 #包括 #包括 #包括 无效复制文件(LPCTSTR strSource、LPCTSTR strDestination) { PIDLIST_绝对绝对绝对值=零PTR; SFGAOF ATTR; HRESULT hr=SHParseDisplayName(strSource、nullptr和absourcepl、0和attrs); 如果(失败(小时)) {
std::wcout我找不到任何方法使其工作。但是工作正常,因此必须有一些选项组合才能工作。我在MSDN上发布了相同的问题,似乎不支持通过IFileOperation处理ZIP文件中的项目。新界面就到此为止!hhmpphh。。