mfc解压7z文件使用静态库不使用dll文件
时间: 2023-12-03 15:02:54 浏览: 169
Zip内存解压 静态编译不带dll文件 支持密码解压
MFC 解压 7z 文件使用 7-Zip 的静态库 "7z.lib" 时,不需要使用 "7z.dll" 文件。下面是一个示例代码:
```cpp
#include "7z/7z.h"
#include "7z/7zAlloc.h"
#include "7z/7zFile.h"
// 解压 7z 文件到指定目录
bool Extract7zFile(LPCTSTR lpszFilePath, LPCTSTR lpszTargetPath)
{
// 打开 7z 文件
CFileInStream archiveFile;
if (InFile_Open(&archiveFile.file, lpszFilePath) != 0)
{
return false;
}
// 初始化 7z 解压缩器
CLookToRead2 lookStream;
LookToRead2_CreateVTable(&lookStream, false);
lookStream.buf = nullptr;
lookStream.bufSize = 0;
lookStream.realStream = &archiveFile.vt;
CDecodedFileInfo fileInfo;
SzArEx_Init(&fileInfo.db);
SRes res = SzArEx_Open(&fileInfo.db, &lookStream.vt, &g_Alloc, &g_Alloc);
if (res != SZ_OK)
{
InFile_Close(&archiveFile.file);
return false;
}
// 遍历解压缩器中的所有文件
UInt32 numItems = fileInfo.db.NumFiles;
for (UInt32 i = 0; i < numItems; i++)
{
// 获取文件名称
size_t fileNameLen;
SzArEx_GetFileNameUtf16(&fileInfo.db, i, nullptr, &fileNameLen);
CString fileName;
fileName.GetBufferSetLength(fileNameLen);
SzArEx_GetFileNameUtf16(&fileInfo.db, i, (WCHAR*)fileName.GetBuffer(), &fileNameLen);
fileName.ReleaseBuffer();
// 拼接文件路径
CString filePath = lpszTargetPath;
filePath += fileName;
// 创建目录
CString dirPath = filePath.Left(filePath.ReverseFind('\\') + 1);
if (!PathFileExists(dirPath))
{
SHCreateDirectoryEx(NULL, dirPath, NULL);
}
// 打开输出文件流
CFileOutStream outFileStream;
if (OutFile_Open(&outFileStream.file, filePath) != 0)
{
continue;
}
// 解压缩文件
UInt32 blockIndex = fileInfo.db.FileIndexToFolderIndex[i];
UInt64 unpackSize = SzArEx_GetFileSize(&fileInfo.db, i);
res = SzArEx_Extract(&fileInfo.db, &lookStream.vt, blockIndex, &outFileStream.vt, &unpackSize, &g_Alloc, &g_Alloc);
OutFile_Close(&outFileStream.file);
if (res != SZ_OK)
{
continue;
}
}
// 关闭 7z 文件
SzArEx_Free(&fileInfo.db, &g_Alloc);
InFile_Close(&archiveFile.file);
return true;
}
```
该示例代码使用了 7-Zip 的静态库,并通过调用其提供的函数实现了 7z 文件的解压缩。
需要注意的是,为了正确使用 7-Zip 的静态库,需要将 "7z.lib" 文件添加到项目中,并将其路径添加到项目属性中的 "VC++ 目录" 和 "链接器 -> 输入 -> 附加依赖项" 中。同时,还需要包含 "7z" 目录下的头文件。
阅读全文