gpt4 book ai didi

c++ - libarchive 在某些条目上返回错误,而 7z 可以正常提取

转载 作者:行者123 更新时间:2023-11-30 05:02:46 27 4
gpt4 key购买 nike

我在使用 libarchive 3.3.2 版时遇到问题。我写了一个程序来读取 7z 文件中的选定条目,它看起来像:

file.7z
|__ file.xml
|__ file.fog
|__ file_1.fog

但是,该程序无法读取我的大部分存档的 file_1.fog,并且无法读取某些存档的 file.fog。我尝试使用 archive_error_string() 看看会发生什么,错误是 corrupted archivetruncated RAR archiveDecompressing internal错误

这是故障代码:

void list_archive(string name) {
struct archive *a;
struct archive_entry *entry;

// create new archive struct for the file
a = archive_read_new();
archive_read_support_filter_all(a);
archive_read_support_format_all(a);

// open 7z file
int r = archive_read_open_filename(a, name.c_str(), 1024);

if (r != ARCHIVE_OK) {
cout << "cannot read file: " << name << endl;
cout << "read error: " << archive_error_string(a) << endl;
}

// looping through entries
for (;;) {
int status = archive_read_next_header(a, &entry);

// if there's no more header
if (status != ARCHIVE_OK) break;

// print some status messages to stdout
string pathname(archive_entry_pathname(entry));
cout << "working on: " << pathname << endl;

size_t entry_size = archive_entry_size(entry);

// load the entry's content
char * content;
content = (char*)malloc(entry_size);
r = archive_read_data(a, content, entry_size);

// check if archive_read_data was successful
if (r > 0) {
cout << "read " << r << " of " << entry_size << " bytes successfully\n";
// we are interested in .fog file only
if (pathname.back() == 'g') {
// do something with the .fog file
}
}
else // usually the error happens here
if (archive_errno(a) != ARCHIVE_OK) cout << "read error: " << archive_error_string(a) << endl;


// free the content and clear the entry
archive_read_data_skip(a);
free(content);
archive_entry_clear(entry);

cout << "-----" << endl;
}

// we are done with the current archive, free it
r = archive_read_free(a);
if (r != ARCHIVE_OK) {
cout << "Failed to free archive object. Error: " << archive_error_string(a) << endl;
exit(1);
}
}

最佳答案

我找到了麻烦制造者,如果 future 的用户有同样的问题,我会在这里回答。

int r = archive_read_open_filename(a, name.c_str(), 1024);

显然 1024 对于缓冲区大小来说太小了。我将它增加到 102400 并且能够读取/提取我的所有文件。

关于c++ - libarchive 在某些条目上返回错误,而 7z 可以正常提取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49702764/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com