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. Я перевел пример из вышестоящей вики.

Другие вопросы по тегам