Vala: Как получить имена всех файлов в zip-архиве, не разархивируя его?
Есть ли какая-то функция в Вала, как zip:list_dir
в эрланге? Я нашел libgsf, но я не хочу распаковывать zip-файл.
1 ответ
Решение
Ты можешь использовать 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
,
GIO нужен только для IOError
errordomain. На самом деле вы хотели бы продлить check_ok
метод с более описательным сообщением, операция которого не удалась.
Вы также можете ограничить libarchive, чтобы разрешить только файлы ZIP. Я перевел пример из вышестоящей вики.