⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gzipupdate.cpp

📁 由7-zip提供的压缩、解压缩程序
💻 CPP
字号:
// GZipUpdate.cpp#include "StdAfx.h"#include "GZipUpdate.h"#include "Common/Defs.h"#include "Common/StringConvert.h"#include "Windows/Defs.h"#include "Windows/PropVariant.h"#include "../../ICoder.h"#include "../../Common/ProgressUtils.h"#include "../../Compress/Copy/CopyCoder.h"#include "../Common/InStreamWithCRC.h"#ifdef COMPRESS_DEFLATE#include "../../Compress/Deflate/DeflateEncoder.h"#else// {23170F69-40C1-278B-0401-080000000100}DEFINE_GUID(CLSID_CCompressDeflateEncoder, 0x23170F69, 0x40C1, 0x278B, 0x04, 0x01, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00);#include "../Common/CoderLoader.h"extern CSysString GetDeflateCodecPath();#endifnamespace NArchive {namespace NGZip {static const Byte kHostOS = NFileHeader::NHostOS::kFAT;HRESULT UpdateArchive(IInStream *inStream,     UInt64 unpackSize,    ISequentialOutStream *outStream,    const CItem &newItem,    const CCompressionMethodMode &compressionMethod,    int indexInClient,    IArchiveUpdateCallback *updateCallback){  UInt64 complexity = 0;  complexity += unpackSize;  RINOK(updateCallback->SetTotal(complexity));  #ifndef COMPRESS_DEFLATE  CCoderLibrary lib;  #endif  CMyComPtr<ICompressCoder> deflateEncoder;    complexity = 0;  RINOK(updateCallback->SetCompleted(&complexity));  CMyComPtr<ISequentialInStream> fileInStream;  RINOK(updateCallback->GetStream(indexInClient, &fileInStream));  CSequentialInStreamWithCRC *inStreamSpec = new CSequentialInStreamWithCRC;  CMyComPtr<ISequentialInStream> crcStream(inStreamSpec);  inStreamSpec->Init(fileInStream);  CLocalProgress *localProgressSpec = new CLocalProgress;  CMyComPtr<ICompressProgressInfo> localProgress = localProgressSpec;  localProgressSpec->Init(updateCallback, true);    CLocalCompressProgressInfo *localCompressProgressSpec =       new CLocalCompressProgressInfo;  CMyComPtr<ICompressProgressInfo> compressProgress = localCompressProgressSpec;    COutArchive outArchive;  outArchive.Create(outStream);  CItem item = newItem;  item.CompressionMethod = NFileHeader::NCompressionMethod::kDeflate;  item.ExtraFlags = 0;  item.HostOS = kHostOS;  RINOK(outArchive.WriteHeader(item));  localCompressProgressSpec->Init(localProgress, &complexity, NULL);  {    #ifdef COMPRESS_DEFLATE    deflateEncoder = new NCompress::NDeflate::NEncoder::CCOMCoder;    #else    RINOK(lib.LoadAndCreateCoder(GetDeflateCodecPath(),        CLSID_CCompressDeflateEncoder, &deflateEncoder));    #endif    NWindows::NCOM::CPropVariant properties[] =     {       compressionMethod.NumPasses,       compressionMethod.NumFastBytes,      compressionMethod.NumMatchFinderCycles    };    PROPID propIDs[] =     {       NCoderPropID::kNumPasses,       NCoderPropID::kNumFastBytes,      NCoderPropID::kMatchFinderCycles    };    int numProps = sizeof(propIDs) / sizeof(propIDs[0]);    if (!compressionMethod.NumMatchFinderCyclesDefined)      numProps--;    CMyComPtr<ICompressSetCoderProperties> setCoderProperties;    RINOK(deflateEncoder.QueryInterface(IID_ICompressSetCoderProperties, &setCoderProperties));    RINOK(setCoderProperties->SetCoderProperties(propIDs, properties, numProps));  }  RINOK(deflateEncoder->Code(crcStream, outStream, NULL, NULL, compressProgress));  item.FileCRC = inStreamSpec->GetCRC();  item.UnPackSize32 = (UInt32)inStreamSpec->GetSize();  RINOK(outArchive.WritePostHeader(item));  return updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK);}}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -