我正在尝试使用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
。我在这里做错什么了吗?