Запись файла внутри 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));
}