如何解决如何将存档写入在内存中创建的磁盘?
我有一个在磁盘上加密的 zip 存档。我将文件读入缓冲区,对其进行解密(使用一些自定义算法),然后在内存中将其压缩。
现在我可以修改存档了,但是如何将更改写回磁盘?我错过了什么吗?存档是用 zip_source_buffer_create(...)
创建的,当调用 zip_close(...)
时,会对内存进行更改。
麦克维:
#include <zip.h>
#include <fstream>
#include <filesystem>
#include <vector>
#include <string>
int main(int argc,char** argv) {
std::string zip_file = "test.zip";
size_t file_sz = std::filesystem::file_size("test.zip");
std::vector<char> buf(file_sz);
std::ifstream ifs{ zip_file,std::ios::binary };
ifs.read(buf.data(),file_sz);
/*
buffer is decrypted here
*/
zip_error_t ze;
zip_error_init(&ze);
zip_source_t* zip_source = zip_source_buffer_create(buf.data(),buf.size(),1,&ze);
zip_t* zip = zip_open_from_source(zip_source,NULL,&ze);
zip_source_t* file_source = zip_source_buffer(zip,"hello",6,0);
zip_file_add(zip,"hello.txt",file_source,ZIP_FL_ENC_GUESS);
zip_source_free(file_source);
zip_error_fini(&ze);
zip_close(zip); //modifications are written to memory but how do I retrieve the data?
/*
zip data should be acquired here,encrypted,and written to disk
*/
return 0;
}
解决方法
zip_close()
将新数据写入打开 zip 的原始 zip_source_t
,在您的情况下,它是包装 zip_source
缓冲区的 vector
变量。
当 zip_close()
提交到您的 zip_source
时,zip_source
指向的输入缓冲区(vector
缓冲区)将被 libzip 分配的新数据缓冲区替换.因此,您应该能够调用 zip_source_keep(zip_source)
以确保 zip_close()
不会从内存中释放 zip_source
,然后您可以使用 zip_source_open(zip_source)
和 zip_source_read(zip_source)
从根据需要zip_source
的新数据缓冲区,然后您可以在完成后调用zip_source_close(zip_source)
和zip_source_free(zip_source)
。
对您从 zip_source
中读取的数据做任何您想做的事情,然后将其保存到您选择的磁盘文件中。
libzip 的 repo 中提供了此过程的示例:
https://github.com/nih-at/libzip/blob/master/examples/in-memory.c
,我在 libzip 发行版中找到了解决方案。文件 examples/in-memory.c
。代码比较多,这里就不贴了。
它涉及到 zip_source_keep
在内存中关闭存档后保持源处于活动状态,zip_stat
知道读取缓冲区大小和 zip_source_open
/ zip_source_read
读取源'内容。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。