2016-09-24 2 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로 바뀌 었습니다. Vala 개발자가이를 수정할 수 있도록 https://bugzilla.gnome.org/ (product Vala)에 신고 할 수 있습니다. –

+0

libarchive devs가 archive_read_finish를 제거하지 않는 한 계속해서 vapi를 사용할 수 있습니다. –

관련 문제