2016-09-24 5 views

答えて

0

libarchiveを使用できます。

void check_ok (Archive.Result r) throws IOError { 
    if (r == Archive.Result.OK) 
     return; 
    if (r == Archive.Result.WARN) 
     return; 
    throw new IOError.FAILED ("libarchive returned an error"); 
} 

int main() { 

    try { 
     var a = new Archive.Read(); 
     check_ok (a.support_filter_all()); 
     check_ok (a.support_format_all()); 
     check_ok (a.open_filename ("archive.zip", 10240)); 

     unowned Archive.Entry entry; 
     while (a.next_header (out entry) == Archive.Result.OK) { 
      stdout.printf ("%s\n", entry.pathname()); 
      a.read_data_skip(); 
     } 
    } 
    catch (IOError e) { 
     stderr.printf (e.message + "\n"); 
     return 1; 
    } 

    return 0; 
} 

valac ListZip.vala --pkg libarchive --pkg gio-2.0でコンパイルします。

IOError errordomainにのみGIOが必要です。実際には、操作が失敗したより説明的なメッセージでcheck_okメソッドを拡張したいと考えています。

また、zipファイルのみを許可するようにlibarchiveを制限することもできます。私はexample from the upstream wikiを翻訳しました。

+0

GCCは 'archive_read_finish'は廃止予定であると警告しました。警告を消すために私ができることはありますか? – huron

+0

libarchive.vapiファイルを更新する必要があり、archive_read_finish関数の名前がlibarchive 3.0.2のarchive_freeに変更されました。これをhttps://bugzilla.gnome.org/(product Vala)に報告すると、Vala開発者はそれを修正できます。 –

+0

libarchiveの開発者はarchive_read_finishを削除しない限り、そのままvapiを使用することができます。 –

関連する問題