2

我从这里使用 libzip android 端口。我可以在我的存档调用中添加一个新文件zip_add(_zip, filePath, zip_source_callback)。它创建一个空文件。我怎样才能将数据写入这个空文件?

我知道我必须以我的zip_source_callback方法处理它,但我不知道具体是什么以及如何处理。任何帮助将不胜感激。

我的 zip_source_callback 现在看起来像这样:

ssize_t  _source_callback(void *state, void *data, size_t len, enum zip_source_cmd cmd)
{
    ssize_t r = 0;
    switch ( cmd )
    {
        case ZIP_SOURCE_OPEN:
        {
            LOGD("ZIP_SOURCE_OPEN");
            break;
        }
        case ZIP_SOURCE_CLOSE:
        {
            LOGD("ZIP_SOURCE_CLOSE");
            break;
        }
        case ZIP_SOURCE_STAT:
        {
            LOGD("ZIP_SOURCE_STAT");
            break;
        }
        case ZIP_SOURCE_ERROR:
        default:
        {
            LOGD("ZIP_SOURCE_ERROR");
            break;
        }
        case ZIP_SOURCE_READ:
        {
            LOGD("ZIP_SOURCE_READ");
            break;
        }
        case ZIP_SOURCE_FREE:
        {
            LOGD("ZIP_SOURCE_FREE");
            return 0;
        }
    }
    return r;
}
4

1 回答 1

1

zip_source_callback如果要添加的数据是连续的内存块,则不需要使用;你可以用它zip_source_buffer来创建zip_source_t你需要的,这更简单。zip_source_bufferhttps://libzip.org/documentation/zip_file_add.html有一个如何使用的例子

在这里,我调整了他们的示例,将内存添加到std::vector被调用的dataVector. 此代码将放置在打开和关闭 zip 存档的代码之间。

zip_source_t *source;
if ((source=zip_source_buffer(archive, dataVector.data(), dataVector.size(), 0)) == nullptr ||
    zip_file_add(archive, name, source, ZIP_FL_ENC_UTF_8) < 0) {
        zip_source_free(source);
        printf("error adding file: %s\n", zip_strerror(archive));
}
于 2019-07-03T09:51:35.817 回答