Я почти год назад писал про инструмент с открытым кодом filerepack для пересжатия файлов. Это такой мой очень давний пэт проект, порожденный изначально необходимостью регулярно пересжимать какие-то файлы потому что базовые инструменты слишком часто делали их чрезмерно большими их можно было пересжать в 1.5-2 раза без потери функционала, то есть без необходимости распаковки перед тем как использовать. Живой пример - это все файлы в современных форматах MS Office OOXML - .docx, .xlsx, .pptx и все из этого семейства. Во первых все версии MS Office сжимают ZIP контейнер, которыми эти форматы являются, довольно плохо и просто распаковать файл и запаковать с максимальным сжатием уже давало результат. Во вторых большая часть изображений в этих файлах поддаются эффективному сжатию без потерь и могут уменьшиться в диапазоне 10-75% и итоговый файл уменьшится весьма существенно.
Как бы то ни было этот инструмент я делал давно и в нем было одно существенное ограничение - это то что старые форматы файлов MS Office (.doc, .xls, .ppt и др.) такому пересжатию не поддавались. Причина в том что они и ряд других форматов файлов придуманных Microsoft имели в своей основе Compound File Binary Format к которому есть очень ограниченное число открытых реализаций и большая их часть только на просмотр двоичных потоков внутри и не более того.
При этом у меня в архивах файлов в этих старых форматах MS Office накопилось немало, всегда хотелось их пересжать. И тут я подумал, а почему бы не попробовать и скормил подробное ТЗ в Claude Code с помощью которого в итоге собрал версию которая умеет пересжимать теперь еще и эти файлы. Это было непросто, для пересжатия используется анализатор OLE файлов в виде Python кода и пересборщих в виде кода на Rust поскольку только в Rust'е есть реализация кроссплатформенной библиотеки записи Compound файлов.
В итоге filerepack начиная с последней версии 0.4.0 умеет пересжимать основные старые форматы MS Office .ppt, .xls, .doc и это самое большое и самое сложное изменение в инструменте с момента его создания. Остальные правки по мелочи - поддержка большего числа форматов использующих ZIP как контейнер, поддержка большего числа файлов с данными и тд. Подробнее есть в документации включая примеры, руководства и так далее.
Отвечая на важный вопрос "А зачем?" который очень важно задавать и другим и, обязательно, себе. Казалось бы цена хранения файлов снижается и нет нужды лишний раз заморачиваться еще и сжатием контента. Это и так и не так.
Во первых многие файлы хранятся в облачных файловых хранилищах которые могут менять условия и стоимость хранения и с легкостью забиваются однотипными/похожими файлами и в этом случае лучше положить туда пересжатую версию этого файла и сэкономить на лишних расходах.
Во вторых многие личные архивы хранятся в криптоконтейнерах. Например, я лично ничего из личной чувствительной информации не храню просто на дисках и складываю файлы в криптоконтейнеры ограниченного размера. У этого есть ряд плюсов для параноиков, но есть и минус, там нет динамического увеличения размера по мере наполнения файлами. Место надо предвыделить и если еще и этот криптоконтейнер где содержимое часто меняется и его надо бэкапить то чем меньше он тем лучше. Тут то вопрос про сжатие файлов становится актуальным, но так чтобы без потери функциональности.
Есть и множество других кейсов использования, а это мои личные.
Поддержка файлов в старых форматах MS Office всё еще экспериментальна, если надумаете ее попробовать и столкнетесь с ошибками, пишите мне, лучше всего в issues на Github. Там же можно писать если какие-то популярные форматы есть и еще не поддерживаются или их рекомпрессия работает с ошибками.
Вообще же не могу вспомнить периода жизни когда я что-то не архивировал. Начиная с первых жестких дисков на 10МБ, дискетами на 360КБ. Все моё детство состояло из попыток что-то куда-то сжать чтобы не удалять потому что места всегда нехватало. Насколько проще стало все сейчас, но всегда найдется чем занять любые объемы хранения, так что сжимать файлы всегда актуально;)
#opensource #compression #data
Post #7818
496