Не удалось извлечь двоичный файл из архива Tar с помощью libarchive

Обновить

Пример ниже работает. Я неправильно понял намерение флага ARCHIVE_EXTRACT_TIME и ожидал увидеть вновь созданный файл. Вместо этого файл был извлечен правильно, но с первоначальной датой создания. Это была длинная неделя! 🙂


У меня есть следующие данные, хранящиеся в архиве Tar:

  • выбрать /
  • fw.bin
  • объявление/
    • бен /
      • installer.sh

У меня есть следующий код, работающий на Ubuntu (g ++ версия 5.2.1), для извлечения содержимого архива в память с использованием libarchive, в основном взятый из примеров:

int copy_data(struct archive *ar, struct archive *aw)
{
int r;
const void *buff;
size_t size;
#if ARCHIVE_VERSION_NUMBER >= 3000000
int64_t offset;
#else
off_t offset;
#endif
for (;;) {
r = archive_read_data_block(ar, &buff, &size, &offset);
if (r == ARCHIVE_EOF)
return (ARCHIVE_OK);
if (r != ARCHIVE_OK)
return (r);
r = archive_write_data(aw, buff, size);
if (size != r)
{
std::cerr << "Failed to write " << (size - r) << " Bytes\n";
}
}
}

}

int main(int argc, char** argv)
{
std::ifstream input("archive.tar.gz", std::ios::binary | std::ios::ate );
auto const size = input.tellg();
char* buffer = new char[size];
input.seekg(0);
input.read(buffer, size);
input.close();

struct archive *a;
struct archive *ext;
struct archive_entry *entry;
int retCode;
int flags = ARCHIVE_EXTRACT_TIME;

a = archive_read_new();
archive_read_support_format_all(a);

ext = archive_write_disk_new();
archive_write_disk_set_options(ext, flags);
archive_write_disk_set_standard_lookup(ext);

if ((retCode = archive_read_open_memory(a, buffer, size)))

for (;;) {
retCode = archive_read_next_header(a, &entry);
if (retCode == ARCHIVE_EOF)
{
break;
}
if (retCode != ARCHIVE_OK)
{
return -1;
}

retCode = archive_write_header(ext, entry);
if (retCode != ARCHIVE_OK)
{
return -1;
}
else
{
if (archive_entry_size(entry) > 0)
{
copy_data(a, ext);
}
retCode = archive_write_finish_entry(ext);
if (retCode != ARCHIVE_OK)
{
return -1;
}

}
}
archive_read_close(a);
archive_read_free(a);

archive_write_close(ext);
archive_write_free(ext);

return 0;
}

Он правильно распаковывает каталоги, как указано выше, и записывает файл installer.sh. Однако двоичный файл (fw.bin) отсутствует.
Существуют ли конкретные настройки, которые мне не хватает для записи двоичных файлов на диск? Я использую неправильные вызовы API?

3

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]