3、lib7z-Memory从内存或网络解压数据(7z内存解压完成)

在编译生成Dec7z.lib后,我们验证一下吧。首先建立一个控制台工程,然后引入这个lib:

#pragma comment(lib,"E:\\mjy\\projects\\build-Dec7z-453VC6Static-Release\\release\\Dec7z.lib")
由于我建的是c++工程,所以需要添加extern "C"来调用lib里的函数:

extern "C" BOOL Extra7zFileToPath(WCHAR* sTargetPath,
                                  HWND hwnd,
                                  BOOL bUpdate,
                                  char* pAllData,
                                  DWORD iLength);

测试数据用app.7z来进行(下面有下载),先读取全部数据到内存:

DWORD iAllDataLengtth = 0;
    char* pAllData = NULL;
    size_t iReadedSize = 0;

    FILE* fp = NULL;
    fp = fopen("C:\\Users\\Admin\\Desktop\\app.7z","rb");
    if(fp == NULL)
    {
        printf("--open dail Desktop app.7z");
        return FALSE;
    }
    else
    {
        fseek(fp,0,SEEK_END);
        iAllDataLengtth = ftell(fp);

        fseek(fp,0,SEEK_SET);
        pAllData = (char*)malloc(iAllDataLengtth);
        memset(pAllData,0,iAllDataLengtth);
        iReadedSize = fread(pAllData,1,iAllDataLengtth,fp);


        printf("--iAllDataLengtth:%d\n",iAllDataLengtth);
        printf("--iReadedSize:%d\n",iReadedSize);
        fclose(fp);
    }

接下来,开始解压了,"C:\\Users\\Admin\\Desktop\\KuPlayer" 是解压的目录

    Extra7zFileToPath(L"C:\\Users\\Admin\\Desktop\\KuPlayer",
                      NULL,
                      FALSE,
                      pAllData,
                      iAllDataLengtth);


来看一下结果吧


我们成功了!欢呼吧,哈哈!

不忍私藏,提供测试工程和数据下载:

http://download.csdn.net/detail/hats8888/9649148


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以使用7-Zip SDK来解压7z文件,以下是基本的解压代码示例: ```c++ #include <7z.h> #include <7zCrc.h> int ExtractArchive(const char* archivePath, const char* outputPath) { int res = 0; HANDLE archiveHandle = NULL; SevenZipLibrary lib; if (lib.Load() && lib.CreateObject(CLSID_CFormat7z, &IID_IInArchive, (void**)&archiveHandle) == S_OK) { if (lib.QueryInterface(archiveHandle, IID_IInArchive, (void**)&archiveHandle) == S_OK) { if (archiveHandle->OpenFile(archivePath) == S_OK) { UInt32 numItems = 0; archiveHandle->GetNumberOfItems(&numItems); for (UInt32 i = 0; i < numItems; i++) { NCOM::CPropVariant prop; archiveHandle->GetProperty(i, kpidPath, &prop); UString filePath = prop.bstrVal; UInt32 size = 0; archiveHandle->GetProperty(i, kpidSize, &size); prop.Clear(); archiveHandle->GetProperty(i, kpidIsFolder, &prop); bool isFolder = prop.boolVal; if (!isFolder) { CMyComPtr<ISequentialOutStream> fileStream; UString outputFilePath = outputPath; outputFilePath += filePath; if (CreateComplexDirectory(outputFilePath) && CreateOutFile(outputFilePath, &fileStream)) { res = archiveHandle->Extract(&i, 1, false, fileStream); fileStream.Release(); } } } archiveHandle->Close(); } archiveHandle->Release(); } lib.Free(); } return res; } ``` 这个函数将会解压指定的7z文件到指定的目录,并返回一个值表示操作是否成功。 在解压完成后,你可以使用以下代码删除解压出来的文件夹和文件: ```c++ #include <Windows.h> #include <iostream> bool DeleteDirectory(const char* path) { bool result = true; WIN32_FIND_DATA findData; HANDLE hFind; std::string fullPath = path; fullPath += "/*"; hFind = FindFirstFile(fullPath.c_str(), &findData); if (hFind == INVALID_HANDLE_VALUE) { return false; } do { if (findData.cFileName[0] == '.') { continue; } std::string filePath = path; filePath += "/"; filePath += findData.cFileName; if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if (!DeleteDirectory(filePath.c_str())) { result = false; break; } } else { if (!DeleteFile(filePath.c_str())) { result = false; break; } } } while (FindNextFile(hFind, &findData)); FindClose(hFind); if (result) { if (!RemoveDirectory(path)) { result = false; } } return result; } ``` 你可以在解压完成后调用此函数,以删除解压出来的文件夹和文件。 注意:如果你在解压过程中使用了7-Zip SDK的自动删除功能,那么你不需要手动删除解压出来的文件夹和文件。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值