как именно добавить файл архив, что бы в архиве остались ранее добавленные файлы?
P.S. append_file - не работает, т.к. он перезатирает архив целиком после выполнения finish() и ранее добавленные файлы в архив, уничтожаются.
append_file работает правильно, просто когда в этой библиотеке создается Builder, то он в качестве аргумента принимает Writer, т.е. он не вычитывает уже имеющийся архив (к тому же, вы открываете его только для записи), а может только в файл писать. Я не нашел метода, позволяющего в Builder одним махом всю структуру архива затолкать, а значит (скорее всего), вам придется заняться увлекательным делом: вручную пересобрать архив, т.е. вычитывать данные и добавлять в Builder. p.s. Не стоит вызывать после добавления каждого файла метод finish(), по сути этим методом вы сбрасываете данные во Writer, в вашем случае, в файл и обнуляете его. Добавили файлы, записали в конце.
Спасибо. Вызов finish это для примера, естественно он вызывает один раз после всех записей. Я так и думал, что придется полностью все распаковать и заново собрать, но блин, а если у меня ограничено места и памяти, и нет возможно распаковать весь архив…, но как бы окей, можно частями распаковывать, но это тоже гемор. Думаю стоит поднять этот вопрос на гит хабе разработчикам данной либы, может чего предложат или доработают ее.
Не думаю, что это без аллокаций можно решить. Под капотом при добавлении файла в архив всё равно создается временный файл на диске или в памяти, куда копируется информация. Да, было бы красиво так добавлять: прочитал архив, добавил файл, записал архив. Но думаю, что им просто лень всю эту грязную работу делать, потому что под капотом так же придется переформировать архив заново
Хм, но ведь аллокация будет происходит только архива и то при условии если его размер начнет превышать сегмент данных на диске. А так же, когда мы добавляем файл архив, то он encode отдельно и в архив можно тупо снизу подложить эти данные, ведь не так ли?
я не специалист по работе с архивами, есть разные типы, иногда файлы закодированы сплошным потоком и для того, чтобы достать или положить файл, надо весь этот поток декодировать, т.е. нельзя просто сменить пару байтиков в заголовке и дописать немного данных в конце. Ладно, это уже оффтоп
Да, это уже офф топ, но на сколько я знаю, это уже зависит от выбора алгоритмы, как кодировать, в одном потоке (все файлы разом) или в разных (по конкретному файлу) и от этого будет зависеть распаковка, можем ли мы распаковать частично или требуется распаковывать все. Еще раз Вам спасибо 🙏!
В любом случае, при добавлении информации о вставленных файлах увеличивается размер служебной области в архиве. И если она в начале файла, тогда непосредственно закодированную информацию придется двигать "вправо", а значит всё перезаписывать.
Обсуждают сегодня