SevenZip++显示当前压缩进度的范例

以前写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终于可以正常获取进度了!而且调试代码发现,还可以获取当前的 已经压缩的大小和已经压缩后的大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值