bit7z是一个对7-zip的静态wrapper库(GitHub - rikyoz/bit7z: A C++ static library offering a clean and simple interface to the 7-zip shared libraries. · GitHub),大大简化了文件压缩与解压的过程,提供一个简单的示例。7-zip支持市面上绝大多数压缩文件格式(zip,7z,tar,xz,...),都可以通过bit7z进行调用。
#include <bit7z/bitarchivewriter.hpp>
#include <bit7z/bitarchivereader.hpp>
#include <io.h>
#include <cstdio>
#pragma comment(lib, "bit7z.lib")
class Bit7zHelper
{
public:
Bit7zHelper() :total(0) {}
void TotalSizeNotify(uint64_t sz)
{
total = sz;
printf("TotalCallback: %lld.\n", sz);
}
bool ProgressUpdate(uint64_t sz)
{
printf("ProgressCallback: %.4f.\n", total == 0 ? 0.0 : (100 * 1.0 * sz) / total);
return true;
}
void FileOnChange(bit7z::tstring filename)
{
printf("Begin Process File %s.\n",filename.c_str());
}
private:
uint64_t total;
};
bool CompressFolderTo()
{
bool bRet = false;
const char* dstFile = "C:/Users/project/test/output.7z";
try
{ // bit7z classes can throw BitException objects
using namespace bit7z;
Bit7zLibrary lib{ "7z.dll" };//find 7z.dll on your computer,if you don't have 7z.dll, then install 7z software to get one.
BitArchiveWriter archive{ lib, BitFormat::SevenZip };
Bit7zHelper hlp;
TotalCallback tcb = [&hlp](uint64_t sz) {hlp.TotalSizeNotify(sz); };
FileCallback fcb= [&hlp](bit7z::tstring filename) {hlp.FileOnChange(filename); };
ProgressCallback pcb= [&hlp](uint64_t sz) {return hlp.ProgressUpdate(sz); };
archive.setTotalCallback(tcb);
archive.setFileCallback(fcb);
archive.setProgressCallback(pcb);
archive.setPassword("123456");
// Adding the items to be compressed (no compression is performed here)
archive.addFile("C:/Users/project/test/file1.txt","A/B/file1.txt");
archive.addFile("C:/Users/project/test/file2.txt", "A/file2.txt");
//archive.addDirectory("C:/Users/project/test");//add the whole test folder(include the all subfolders and files of test)
if (_access(dstFile, 0) == 0)//delete if already existed.
{
if (remove(dstFile) != 0)
{
goto end;
}
}
// Compressing the added items to the output archive
archive.compressTo(dstFile);
bRet = true;
}
catch (const bit7z::BitException& ex)
{
std::error_code code = ex.code();
int errCode = code.value();
if (errCode == 126)
printf("Please Get the 7z mudule firstly.\n");
printf("error: %s[%d].\n", ex.what(), errCode);
}
end:
return bRet;
}
bool ExtractCompressedTo()
{
bool bRet = false;
DWORD attr = 0;
const char* srcZipfile = "C:/Users/project/test/output.7z";
const char* dstFolder= "C:/Users/project";
if (_access(dstFolder, 0) == -1)
return bRet;
if (_access(srcZipfile, 0) == -1)
return bRet;
attr = GetFileAttributesA(dstFolder);
if ((attr & FILE_ATTRIBUTE_DIRECTORY) == 0)
return bRet;
try { // bit7z classes can throw BitException objects
using namespace bit7z;
Bit7zLibrary lib{ "7z.dll" };//find 7z.dll on your computer,if you don't have 7z.dll, then install 7z software to get one.
// Opening the archive
BitArchiveReader archive{ lib, srcZipfile, BitFormat::SevenZip };
archive.setPassword("123456");
// Testing the archive
archive.test();
// Extracting the archive
archive.extractTo(dstFolder);
bRet = true;
}
catch (const bit7z::BitException& ex)
{
std::error_code code = ex.code();
int errCode = code.value();
if (errCode == 126)
printf("Please Get the 7z mudule firstly.\n");
printf("error: %s[%d].\n", ex.what(), errCode);
}
return bRet;
}