Извлечь / распаковать сжатый файл xz с помощью libarchive

Я пытаюсь извлечь данные в файл xz с помощью libarchive. Я использую следующий код:

struct archive *a;
struct archive *ext;
struct archive_entry *entry;
int flags;
int r = ARCHIVE_OK;

/* Select which attributes we want to restore. */
flags = ARCHIVE_EXTRACT_TIME;
flags |= ARCHIVE_EXTRACT_PERM;
flags |= ARCHIVE_EXTRACT_ACL;
flags |= ARCHIVE_EXTRACT_FFLAGS;

// Source Archive
a = archive_read_new();

r |= archive_read_support_format_all( a );
r |= archive_read_support_format_raw( a );
r |= archive_read_support_filter_all( a );

if ( ( r |= archive_read_open_filename( a, archiveName, 10240 ) ) < ARCHIVE_OK ) {
fprintf( stderr, "%s\n", archive_error_string( a ) );
return false;
}

r = ARCHIVE_OK;

// Structure to write files to disk
ext = archive_write_disk_new();
r |= archive_write_disk_set_options( ext, flags );
r |= archive_write_disk_set_standard_lookup( ext );

if ( r < ARCHIVE_WARN ) {
fprintf( stderr, "%s\n", archive_error_string( a ) );
return false;
}

while ( true ) {
r = archive_read_next_header( a, &entry );
if ( r == ARCHIVE_EOF )
break;

if ( r < ARCHIVE_OK )
fprintf( stderr, "%s\n", archive_error_string( a ) );

if ( r < ARCHIVE_WARN )
return 1;

r = archive_write_header( ext, entry );
if ( r < ARCHIVE_OK )
fprintf( stderr, "%s\n", archive_error_string( ext ) );

else if ( archive_entry_size( entry ) > 0 ) {
r = copyData( a, ext );
if ( r < ARCHIVE_OK )
fprintf( stderr, "%s\n", archive_error_string( ext ) );

if ( r < ARCHIVE_WARN )
return 1;
}

r = archive_write_finish_entry( ext );
if ( r < ARCHIVE_OK )
fprintf( stderr, "%s\n", archive_error_string( ext ) );

if ( r < ARCHIVE_WARN )
return 1;
}

archive_read_close( a );
archive_read_free( a );

archive_write_close( ext );
archive_write_free( ext );

return true;

Этот код прекрасно работает с контейнерами, такими как xz, сжатый tar, или zip, или даже 7z и iso файлы. Где это терпит неудачу, — когда у меня есть файл как file.xz, я не могу извлечь его. Когда приведенный выше код выполняется для file.xz все, что он создает, это пустой файл data, Я что-то здесь не так делаю?

0

Решение

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

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

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

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