以前写7z压缩工具,直接调用命令行的话,因为无法提取命令行的压缩进度所以无法在界面上显示当前压缩进度,现在用SevenZip++,成功提取到了压缩到7z过程中的压缩进度,先在命令行中展示一下效果吧。
直接上代码,看着代码调试了一下,于是得到了如下关键代码:
class ArchiveUpdateCallbackEx : public ArchiveUpdateCallback
{
public:
ArchiveUpdateCallbackEx(const TString& dirPrefix, const std::vector< FilePathInfo >& filePaths):
ArchiveUpdateCallback(dirPrefix, filePaths)
{
}
// IProgress
STDMETHOD(SetTotal)(UInt64 size)
{
m_size = size;
return S_OK;
}
STDMETHOD(SetCompleted)(const UInt64* completeValue)
{
m_completeValue = *completeValue;
if (m_size)
{
printf("%.2lf%%\r", m_completeValue * 1.0 / m_size * 100.0);
}
return S_OK;
}
// ICompressProgressInfo
STDMETHOD(SetRatioInfo)(const UInt64* inSize, const UInt64* outSize)
{
return S_OK;
}
private:
UInt64 m_size = 0;
UInt64 m_completeValue = 0;
};
按照范例调用回调函数即可。
void SevenZipCompressor::CompressFilesToArchive( const TString& pathPrefix, const std::vector< FilePathInfo >& filePaths )
{
std::cout << "正在压缩文件..." << std::endl;
CComPtr< IOutArchive > archiver = GetArchiveWriter(m_library, m_compressionFormat);
SetCompressionProperties( archiver );
CComPtr< OutStreamWrapper > outFile = new OutStreamWrapper( OpenArchiveStream() );
CComPtr< ArchiveUpdateCallback > callback = new ArchiveUpdateCallbackEx( pathPrefix, filePaths );
HRESULT hr = archiver->UpdateItems( outFile, (UInt32) filePaths.size(), callback );
if ( hr != S_OK ) // returning S_FALSE also indicates error
{
throw SevenZipException( GetCOMErrMsg( _T( "Create archive" ), hr ) );
}
std::cout << "压缩完成!" << std::endl;
}
至此,压缩7z终于可以正常获取进度了!而且调试代码发现,还可以获取当前的 已经压缩的大小和已经压缩后的大小。