Запись файла внутри zip с использованием libzip

Я использую 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;
}

0 ответов

Вам не нужно использовать zip_source_callbackесли данные, которые вы хотите добавить, представляют собой непрерывный блок памяти; вы можете использоватьzip_source_buffer создать zip_source_tвам нужно, что проще. Вот пример того, как использоватьzip_source_bufferна https://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));
}
Другие вопросы по тегам