Q: low level zip access

Преамбула:

Capture One умеет (не знаю когда, имел дело только с результатом) писать такие вот .eip-файлы.

Каждый такой .eip - это нежатый ZIP-файл (от ZIP - только контейнер) в котором лежит файлик 0.RAW (вместо RAW - реальное расширение, .IIQ или .NEF или еще чего) и немножко служебных файлов самой C1.

FastRawViewer и RawDigger ходят в эти файлы с помощью libarchive: archive_read_open_fd()/archive_read_next_header(), находят 0.EXT, аллоцируют буфер и читают туда через archive_read_data().

Когда мы затем читаем эти RAW-файлы целиком - ну тратится лишней памяти (на размер RAW), но пережить можно. Однако если из файла читается только превьюшка - аллоцировать буфер на целый файл и читать этот целый файл - ужасно обидно.

Соответственно, вопрос:

А не встречал ли кто 'low level' библиотеки для доступа к ZIP-файлам? Ну то есть мне надо считать оглавление и смещения/размеры данных в файле (и, для гарантии, вид сжатия), а дальше - для нежатых ZIP-ов я бы сделал себе mmap() нужного куска и не читал бы с диска лишнего.

Comments

Я когда-то (когда был молодой и глупый, и писал на Turbo Pascal) такую библиотеку. За день написал. Там на час работы. С другими форматами сложнее было.

Такая библиотека есть в составе стандартной библиотеки чуть ли не любого скриптового языка (на нем же написанная) - в Tcl - TclVfs. в Perl - Archive::Zip, чем питон свои "яйца" читает, не вникал, но тоже не libarchive.

В общем, формат такой, что реализовать его посредством обычных файловых операций проще, чем разбираться в API библиотеки, которая его (в числе прочего) реализует.

Ну там же, поди, в 2015-м году куча всяких подробностей. "файлы больше 4Gb", "utf-8" и прочие подобные глупости.
Не хочется самому, должно же быть готовое!