从API版本26.0.0开始支持文件归档类压缩解压缩,适用于将多个文件和目录打包为一个归档文件,或者从归档文件中提取文件到指定目录的场景。主要应用场景包括:
| 接口名称 | 描述 |
|---|---|
| OH_Archive_Writer_OpenFile(const char *outFile, OH_Archive_OpenMode openMode, OH_Archive_Format fmt) | 打开归档文件并创建写入器。 |
| OH_Archive_Writer_Add(OH_Archive_Writer_Ctx arc, const char **infiles, uint64_t fileNum) | 向归档文件中添加文件或目录。 |
| OH_Archive_Writer_Close(OH_Archive_Writer_Ctx arc) | 关闭归档写入器。 |
| 接口名称 | 描述 |
|---|---|
| OH_Archive_Reader_OpenFile(const char *inFile) | 打开归档文件并创建读取器。 |
| OH_Archive_Reader_ExtractAllFile(OH_Archive_Reader_Ctx arc, const char *outDir) | 解压缩归档文件中的所有文件到指定目录。 |
| OH_Archive_Reader_Close(OH_Archive_Reader_Ctx arc) | 关闭归档读取器。 |
在CMake脚本中链接动态库
CMakeLists.txt中添加以下lib。
target_link_libraries(sample PUBLIC liboharchive.so)
添加头文件
#include <filemanagement/archive/oh_archive.h>
static napi_value ZipFileCompress(napi_env env, napi_callback_info info)
{
// 获取输入文件路径和输出归档文件路径
size_t argc = 2;
napi_value argv[2] = {nullptr};
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
size_t inPathSize;
size_t zipPathSize;
char inPathBuf[PATH_BUFFER_SIZE];
char zipPathBuf[PATH_BUFFER_SIZE];
napi_get_value_string_utf8(env, argv[0], inPathBuf, sizeof(inPathBuf), &inPathSize);
napi_get_value_string_utf8(env, argv[1], zipPathBuf, sizeof(zipPathBuf), &zipPathSize);
// 创建测试文件并写入内容
std::string content = "test content这是测试内容Hello, hello!第一行数据";
std::string file(inPathBuf);
std::ofstream stdfile(file, std::ios::out | std::ios::trunc);
if (stdfile.is_open()) {
stdfile << content;
stdfile.close();
}
std::vector<const char *> srcFiles;
srcFiles.push_back(file.c_str());
int ret;
// 打开归档文件并创建写入器,指定ZIP格式
OH_Archive_Writer_Ctx arc = OH_Archive_Writer_OpenFile(zipPathBuf, OH_ARCHIVE_OPEN_MODE_CREATE, OH_ARCHIVE_FMT_ZIP);
// 设置压缩算法为DEFLATE,压缩级别为6
ret = OH_Archive_Writer_SetCompressMethod(arc, OH_ARCHIVE_COMPRESS_DEFLATE, int32_t(6)); // 压缩等级为6
// 设置进度回调,用于获取压缩进度信息
OH_Archive_ProgressHandlerWithData progressHandlerFunc = ProgressHandler;
ret = OH_Archive_Writer_SetProgressHandlerWithData(arc, progressHandlerFunc, nullptr);
// 添加文件到归档中
ret = OH_Archive_Writer_Add(arc, srcFiles.data(), srcFiles.size());
// 关闭归档写入器,完成压缩并释放资源
ret = OH_Archive_Writer_Close(arc);
napi_value retVal = nullptr;
napi_create_int32(env, ret, &retVal);
return retVal;
} static napi_value ZipFileDecompress(napi_env env, napi_callback_info info)
{
// 获取输入文件路径、归档文件路径和解压输出目录路径
size_t argc = 3;
napi_value argv[3] = {nullptr};
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
size_t inPathSize;
size_t zipPathSize;
size_t outDirSize;
char inPathBuf[PATH_BUFFER_SIZE];
char zipPathBuf[PATH_BUFFER_SIZE];
char outDirBuf[PATH_BUFFER_SIZE];
napi_get_value_string_utf8(env, argv[0], inPathBuf, sizeof(inPathBuf), &inPathSize);
napi_get_value_string_utf8(env, argv[1], zipPathBuf, sizeof(zipPathBuf), &zipPathSize);
napi_get_value_string_utf8(env, argv[2], outDirBuf, sizeof(outDirBuf), &outDirSize); // 第2个参数
// 先压缩文件生成归档文件,用于后续解压缩
int ret = ArchiveCompressFile(inPathBuf, zipPathBuf);
// 打开归档文件并创建读取器
OH_Archive_Reader_Ctx ctx = OH_Archive_Reader_OpenFile(zipPathBuf);
int userData[2] = {0};
// 设置解压缩进度回调
ret = OH_Archive_Reader_SetProgressHandlerWithData(ctx, ProgressHandler, (void *)userData);
// 解压缩归档文件中的所有文件到指定目录
ret = OH_Archive_Reader_ExtractAllFile(ctx, outDirBuf);
// 关闭归档读取器,释放资源
ret = OH_Archive_Reader_Close(ctx);
napi_value result = nullptr;
napi_create_int32(env, ret, &result);
return result;
}