使用 libarchive 从内存中读取 zip arhive header
Reading zip arhive header from memory using libarchive
我正在尝试读取使用 libarchive 存储在内存中的 header 压缩文件。
这是我的尝试
ArchiveReader::ArchiveReader(std::string filename) {
if (!boost::filesystem::exists(filename)) {
throw FileDoesNotExistsException(filename);
}
file_buffer_str = read_file_into_memory(filename);
file_buffer = file_buffer_str.c_str();
archive = archive_read_new();
archive_read_support_filter_all(archive);
archive_read_support_format_all(archive);
reading_result = archive_read_open_memory(archive,file_buffer, sizeof(file_buffer));
auto k = archive_read_next_header(archive, &entry);
while (archive_read_next_header(archive, &entry) == ARCHIVE_OK) {
printf("%s\n", archive_entry_pathname(entry));
archive_read_data_skip(archive); // Note 2
}
reading_result = archive_read_free(archive);
}
std::string ArchiveReader::read_file_into_memory(const std::string& current_file) {
std::ifstream raw_file(current_file, std::ios::binary);
auto buffer = [&raw_file]{
std::ostringstream ss{};
ss << raw_file.rdbuf();
return ss.str();
}();
return buffer;
}
不幸的是,archive_read_next_header return -30,这意味着截断的 zip header。有人可以帮忙吗?
sizeof
不是return字符串的长度!在任何情况下都不要在 C++ 程序中使用 C 字符串。以下是您应该如何编码
reading_result = archive_read_open_memory(archive,
file_buffer_str.data(),
file_buffer_str.size());
不需要 C 字符串 file_buffer
。
我正在尝试读取使用 libarchive 存储在内存中的 header 压缩文件。 这是我的尝试
ArchiveReader::ArchiveReader(std::string filename) {
if (!boost::filesystem::exists(filename)) {
throw FileDoesNotExistsException(filename);
}
file_buffer_str = read_file_into_memory(filename);
file_buffer = file_buffer_str.c_str();
archive = archive_read_new();
archive_read_support_filter_all(archive);
archive_read_support_format_all(archive);
reading_result = archive_read_open_memory(archive,file_buffer, sizeof(file_buffer));
auto k = archive_read_next_header(archive, &entry);
while (archive_read_next_header(archive, &entry) == ARCHIVE_OK) {
printf("%s\n", archive_entry_pathname(entry));
archive_read_data_skip(archive); // Note 2
}
reading_result = archive_read_free(archive);
}
std::string ArchiveReader::read_file_into_memory(const std::string& current_file) {
std::ifstream raw_file(current_file, std::ios::binary);
auto buffer = [&raw_file]{
std::ostringstream ss{};
ss << raw_file.rdbuf();
return ss.str();
}();
return buffer;
}
不幸的是,archive_read_next_header return -30,这意味着截断的 zip header。有人可以帮忙吗?
sizeof
不是return字符串的长度!在任何情况下都不要在 C++ 程序中使用 C 字符串。以下是您应该如何编码
reading_result = archive_read_open_memory(archive,
file_buffer_str.data(),
file_buffer_str.size());
不需要 C 字符串 file_buffer
。