无法从代码创建的存档中读取存档文件

Unable to read archive files from an archive created from code

我正在使用 libzip/c++ 将文件推送到存档,到目前为止一切顺利。我可以使用 WinRar Windows 客户端打开创建的存档,解压缩存档并毫无问题地读取每个文件。

但是当尝试使用 c++/libzip 从存档中读取 一些 文件(由于某种原因位于子文件夹中的文件)时,libzip 似乎无法找到它们,而我的返回的 zip_file 结构是 NULL。我 100% 确定这些文件的路径是正确的。

有趣的事实:如果我手动解压缩创建的存档并使用 WinRar 客户端手动重新打包,那么我可以使用 libzip 读取存档。

我尝试使用以下代码在此处获取有关错误的信息:

if (isNull(zf)) { // zf is of type - struct zip_file* -
    zip_error_t ze;
    zip_error_init(&ze);
    zip_error_code_system(&ze);
    zip_error_code_zip(&ze);
    const char* err = zip_error_strerror(&ze);
    ...
}

没有注册错误代码,err 消息是 No error.

这是怎么回事?

我发现了这个问题和解决方案。

使用 libzip 将文件推送到子文件夹时,还必须使用 zip_dir_add(...) 在存档中单独创建每个目录。

即使不这样做也不会在添加文件时产生错误(例如 WinRar 客户端能够通过自己的目录查看文件),libzip 将无法读取这些文件,除非每个目录都被单独推送。

TLDR:

解析每个推送的文件的目录结构,并使用 zip_dir_add().

单独添加每个子文件夹