使用libarchive提取/解压缩xz压缩文件

时间:2018-09-01 16:11:00

标签: c++ c compression libarchive

我正在尝试使用libarchive将数据提取到xz文件中。我正在使用以下代码:

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 个答案:

没有答案