Извлечь / распаковать сжатый файл xz, используя libarchive - PullRequest
0 голосов
/ 01 сентября 2018

Я пытаюсь извлечь данные из файла 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;

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

...