目录

文件归档类压缩解压缩(C/C++)

场景介绍

从API版本26.0.0开始支持文件归档类压缩解压缩,适用于将多个文件和目录打包为一个归档文件,或者从归档文件中提取文件到指定目录的场景。主要应用场景包括:

约束限制

接口说明

接口的详细说明,请参考oh_archive.h。

[h2]归档文件压缩接口

接口名称 描述
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) 关闭归档写入器。

[h2]归档文件解压缩接口

接口名称 描述
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>

开发步骤

[h2]归档文件压缩

  1. 调用OH_Archive_Writer_OpenFile创建归档写入器。需指定输出文件路径、打开模式(如OH_ARCHIVE_OPEN_MODE_CREATE)和归档格式(如OH_ARCHIVE_FMT_ZIP)。
  2. (可选)调用OH_Archive_Writer_SetCompressMethod设置压缩算法和压缩级别。默认使用DEFLATE压缩算法,压缩级别为6,开发者可根据需要调整。
  3. (可选)调用OH_Archive_Writer_SetProgressHandlerWithData设置进度回调,用于获取压缩进度信息。
  4. 调用OH_Archive_Writer_Add向归档中添加文件或目录,支持同时添加多个文件或目录。
  5. 调用OH_Archive_Writer_Close完成归档写入并释放资源。压缩完成后必须调用此接口释放资源。
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;
}

[h2]归档文件解压缩

  1. 调用OH_Archive_Reader_OpenFile打开归档文件并创建读取器。需指定ZIP文件路径。
  2. (可选)调用OH_Archive_Reader_SetProgressHandlerWithData设置解压缩进度回调。
  3. 调用OH_Archive_Reader_ExtractAllFile将归档文件解压缩到指定目录。解压缩后的文件将保持原有的目录结构。
  4. 调用OH_Archive_Reader_Close关闭归档读取器。解压缩完成后必须调用此接口释放资源。
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;
}

调测验证关键点