mfc解压.7z 文件不使用dll 并显示进度条
时间: 2023-11-30 11:04:14 浏览: 174
Android 解压文件夹带进度条
要在 MFC 中解压 .7z 文件并显示进度条,你可以使用 7z SDK 中的代码,该代码提供了一些用于处理 7z 文件的函数。在这个过程中,你需要使用 MFC 的 CProgressCtrl 控件来实现进度条的显示。
下面是一个简单的示例代码:
```cpp
#include "7z.h"
#include "7zAlloc.h"
#include "7zBuf.h"
#include "7zCrc.h"
#include "7zFile.h"
#include "7zVersion.h"
#define kBufferSize 8192
void Extract7zFile(CString szFilePath, CString szDestPath, CProgressCtrl* pProgressCtrl)
{
HANDLE hFile = CreateFile(szFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
return;
}
CMyComPtr<IInStream> fileStream;
fileStream.Attach(new CInFile(hFile));
NWindows::NFile::NFind::CFileInfo fi;
if (!NWindows::NFile::NFind::FindFile(szFilePath, fi))
{
return;
}
UInt64 fileSize = fi.Size;
pProgressCtrl->SetRange32(0, (int)fileSize);
CArchiveOpenCallback* openCallbackSpec = new CArchiveOpenCallback;
CMyComPtr<IArchiveOpenCallback> openCallback(openCallbackSpec);
openCallbackSpec->PasswordIsDefined = false;
CMyComPtr<IInArchive> archive;
if (CreateObject(CLSID_CFormat7z, &IID_IInArchive, (void**)&archive) != S_OK)
{
return;
}
if (archive->Open(fileStream, &kMaxCheckStartPosition, openCallback) != S_OK)
{
return;
}
UInt32 numItems;
if (archive->GetNumberOfItems(&numItems) != S_OK)
{
return;
}
for (UInt32 i = 0; i < numItems; i++)
{
NWindows::NFile::NFind::CFileInfo fi;
if (!NWindows::NFile::NFind::FindFile(szDestPath, fi))
{
if (CreateDirectory(szDestPath, NULL) != 0)
{
continue;
}
}
pProgressCtrl->SetPos(0);
CArchiveExtractCallback* extractCallbackSpec = new CArchiveExtractCallback;
CMyComPtr<IArchiveExtractCallback> extractCallback(extractCallbackSpec);
extractCallbackSpec->Init(archive, i, pProgressCtrl);
UInt32 testVar = 0;
archive->Extract(&i, 1, false, extractCallback);
extractCallbackSpec->Release();
}
}
class CArchiveExtractCallback :
public IArchiveExtractCallback,
public ICryptoGetTextPassword,
public CMyUnknownImp
{
public:
MY_UNKNOWN_IMP1(ICryptoGetTextPassword)
STDMETHOD(SetTotal)(UInt64 /* size */)
{
return S_OK;
}
STDMETHOD(SetCompleted)(const UInt64* completeValue)
{
pProgressCtrl->SetPos((int)*completeValue);
return S_OK;
}
STDMETHOD(CryptoGetTextPassword)(BSTR* password)
{
return E_NOTIMPL;
}
void Init(IInArchive* archive, UInt32 index, CProgressCtrl* progressCtrl)
{
_archive = archive;
_index = index;
pProgressCtrl = progressCtrl;
}
private:
CMyComPtr<IInArchive> _archive;
UInt32 _index;
CProgressCtrl* pProgressCtrl;
};
class CArchiveOpenCallback :
public IArchiveOpenCallback,
public ICryptoGetTextPassword,
public CMyUnknownImp
{
public:
MY_UNKNOWN_IMP1(ICryptoGetTextPassword)
STDMETHOD(SetTotal)(const UInt64* files, const UInt64* bytes)
{
return S_OK;
}
STDMETHOD(SetCompleted)(const UInt64* files, const UInt64* bytes)
{
return S_OK;
}
STDMETHOD(CryptoGetTextPassword)(BSTR* password)
{
return E_NOTIMPL;
}
};
```
这个示例代码使用了 7z SDK,因此你需要在项目中添加相关的头文件和库文件。此外,你需要将 Extract7zFile 函数中的 szFilePath 和 szDestPath 参数替换为你要解压缩的 7z 文件路径和目标路径。pProgressCtrl 参数是用于显示进度条的 CProgressCtrl 控件。
阅读全文