Здравствуйте. Для упаковки данных в архив, использую: tar = "0.4.40" Уточните, пожалуйста,

как именно добавить файл архив, что бы в архиве остались ранее добавленные файлы?

P.S. append_file - не работает, т.к. он перезатирает архив целиком после выполнения finish() и ранее добавленные файлы в архив, уничтожаются.

7 ответов

14 просмотров

append_file работает правильно, просто когда в этой библиотеке создается Builder, то он в качестве аргумента принимает Writer, т.е. он не вычитывает уже имеющийся архив (к тому же, вы открываете его только для записи), а может только в файл писать. Я не нашел метода, позволяющего в Builder одним махом всю структуру архива затолкать, а значит (скорее всего), вам придется заняться увлекательным делом: вручную пересобрать архив, т.е. вычитывать данные и добавлять в Builder. p.s. Не стоит вызывать после добавления каждого файла метод finish(), по сути этим методом вы сбрасываете данные во Writer, в вашем случае, в файл и обнуляете его. Добавили файлы, записали в конце.

­- Автор вопроса
Sergey Grishayev
append_file работает правильно, просто когда в это...

Спасибо. Вызов finish это для примера, естественно он вызывает один раз после всех записей. Я так и думал, что придется полностью все распаковать и заново собрать, но блин, а если у меня ограничено места и памяти, и нет возможно распаковать весь архив…, но как бы окей, можно частями распаковывать, но это тоже гемор. Думаю стоит поднять этот вопрос на гит хабе разработчикам данной либы, может чего предложат или доработают ее.

Не думаю, что это без аллокаций можно решить. Под капотом при добавлении файла в архив всё равно создается временный файл на диске или в памяти, куда копируется информация. Да, было бы красиво так добавлять: прочитал архив, добавил файл, записал архив. Но думаю, что им просто лень всю эту грязную работу делать, потому что под капотом так же придется переформировать архив заново

­- Автор вопроса
Sergey Grishayev
Не думаю, что это без аллокаций можно решить. Под ...

Хм, но ведь аллокация будет происходит только архива и то при условии если его размер начнет превышать сегмент данных на диске. А так же, когда мы добавляем файл архив, то он encode отдельно и в архив можно тупо снизу подложить эти данные, ведь не так ли?

я не специалист по работе с архивами, есть разные типы, иногда файлы закодированы сплошным потоком и для того, чтобы достать или положить файл, надо весь этот поток декодировать, т.е. нельзя просто сменить пару байтиков в заголовке и дописать немного данных в конце. Ладно, это уже оффтоп

­- Автор вопроса
Sergey Grishayev
я не специалист по работе с архивами, есть разные ...

Да, это уже офф топ, но на сколько я знаю, это уже зависит от выбора алгоритмы, как кодировать, в одном потоке (все файлы разом) или в разных (по конкретному файлу) и от этого будет зависеть распаковка, можем ли мы распаковать частично или требуется распаковывать все. Еще раз Вам спасибо 🙏!

­
Да, это уже офф топ, но на сколько я знаю, это уже...

В любом случае, при добавлении информации о вставленных файлах увеличивается размер служебной области в архиве. И если она в начале файла, тогда непосредственно закодированную информацию придется двигать "вправо", а значит всё перезаписывать.

Похожие вопросы

Обсуждают сегодня

Всем привет. Ребята, подскажите, пожалуйста. у ботов есть ограничение на отправку сообщений - 30 сообщений в секунду, эти ограничения накладываются на все сообщения? или на со...
Artem Stormageddon
4
Блин, ребята, сори за тупые вопросы. А можно ли как-то открыть вебапку по нажатию на кнопку в меню(которое появляется слева, команды)?
Artem Stormageddon
3
Ребята, всем привет. Подскажите, пожалуйста, можно ли как-то через бота понять, что этого бота добавили в группу\канал и выдали ему права администратора?
Artem Stormageddon
9
Привет всем! Почему этот код не срабатывает при добавлении или удалении пользователя из чата? bot.on('chat_member', async (ctx) => { console.log(ctx); }) bot.launch({allo...
Alexander
7
Всем привет. Не понимаю, в чём тут шутка юмора. Убирается только разрешение на send_messages. А send_media_messages остаётся. Как сделать, чтобы оба убирались? await b...
Alexander
2
Есть тут кто занимается разработкой серваков майна? Или знакомые
meow *
3
'frakturBold' => ['𝖆', '𝖇', '𝖈', '𝖉', '𝖊', '𝖋', '𝖌', '𝖍', '𝖎', '𝖏', '𝖐', '𝖑', '𝖒', '𝖓', '𝖔', '𝖕', '𝖖', '𝖗', '𝖘', '𝖙', '𝖚', '𝖛', '𝖜', '𝖝', '𝖞', '𝖟', '𝕬', '𝕭', '𝕮', '𝕯'...
Roma
4
Есть ли лимиты на кол-во вебхук по домену? Стоит в данный момент 900+ ботов и бывает бот перестает отвечать (не приходят вебхуки) 🐒 Помогает только перезапуск
ᅠ [ Кому не ответил, дублируйте ]
11
а что делать если тебя убивают на картах?
Yarik yarik kyda ti lezesh
43
Товарищи, здравствуйте Подскажите, пожалуйста, может кто-нибудь сталкивался с такой задачей Через вебапку можно сканировать qr-код, а есть ли возможность считывать nfc?
Artem Stormageddon
8
Карта сайта