0 / 0 / 0
Регистрация: 12.09.2017
Сообщений: 36
|
||||||
1 | ||||||
Объединение частей GZip архива28.06.2018, 10:29. Показов 2023. Ответов 10
Метки нет (Все метки)
Например есть две части GZip архива, я их объединяю в одну архивную часть. Размер получается верный, но если распаковывать стандартным образом собранный воедино архив, то на выходе получаю разархивированной только самую первую часть архива. Все равно что, если бы я не собирал части архива в один общий архив, а просто разархивировал первую часть.
Самое интересное, что если распаковать такой архив винраром, то все отлично. В чем проблема?
0
|
28.06.2018, 10:29 | |
Ответы с готовыми решениями:
10
Неправильное магическое число в заголовке GZip. Передача должна идти в поток GZip Объединение частей строк Объединение частей файла Разделение текстового файла на переменное количество частей и перемещение этих частей |
28.06.2018, 10:43 | 2 |
Никуда не годный способ. При большом размере файла вам ОЗУ не хватит.
Нет такого стандартного метода. Т.е. от того, что вы слили файлы архивов в один файл, он не стал файлом одного архива. В GZip надо паковать один файл и всё. Алгоритмы сборки и разборки кучи файлов, либо одного файла на части, должны быть понятны и запаковывающей программе, и распаковывающей. В линуксах, например, распространены архивы *.tar.gz. Где tar пакует каталоги файлов в единый файл, а gzip сжимает уже этот единый файл. Потому что формат этот для одного файла. См. выше. Это проблема винрара. Такое поведение самостоятельно закодить тоже возможно. Добавлено через 6 минут В применении не того средства и не тем способом, для которого оно предназначено. Озвучьте исходную задачу.
0
|
0 / 0 / 0
Регистрация: 12.09.2017
Сообщений: 36
|
|
28.06.2018, 10:45 [ТС] | 3 |
Rius, задача такая, нужно заархивировать файл. Поскольку он большой, то я беру массив байтов из большого файла, архивирую этот массив байтов и так пока файл не закончится. На выходе я получаю заархивированные части.
Но мне нужно получить на выходе не части, а единый архив
0
|
0 / 0 / 0
Регистрация: 12.09.2017
Сообщений: 36
|
|
28.06.2018, 10:53 [ТС] | 5 |
Rius, естественно, если файл весит больше гб чем объем озу, то делю его на части.
Добавлено через 2 минуты Rius, как поток? Не совсем понимаю
0
|
28.06.2018, 10:56 | 6 |
Раз так...
Не надо его весь читать в ОЗУ. Архивируйте на лету. Тогда до его размера вообще дела не никакого не будет. Добавлено через 1 минуту См. public static void Compress в справке по GZipStream.Можно юзать готовый метод CopyTo. Можно реализовать его самостоятельно, что даёт возможно прикрутить отображение прогресса выполнения операции.
0
|
0 / 0 / 0
Регистрация: 12.09.2017
Сообщений: 36
|
|
28.06.2018, 10:56 [ТС] | 7 |
Rius, можно пример, как архивировать не записывая массив байтов в память
0
|
28.06.2018, 11:00 | 8 | ||||||||||
Сообщение было отмечено Usaga как решение
Решение
Смысл в том, что в ОЗУ создаётся буфер относительно небольшого размера. В него читается часть исходного файла. Затем он скидывается в поток GZipStream, где уже сжимается. Потом снова читается новая часть... И так до завершения.
Добавлено через 58 секунд Один по ссылке выше. Другой в GZipStream. Сжатие, распаковка файла. Только
Там ниже, кстати, поправили этот момент: GZipStream. Сжатие, распаковка файла.
0
|
0 / 0 / 0
Регистрация: 12.09.2017
Сообщений: 36
|
|
28.06.2018, 11:10 [ТС] | 9 |
Rius, тогда получается нужно будет создавать дополнительные файлы, чтобы затем их читать?
0
|
12079 / 8388 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
|
|
28.06.2018, 11:27 | 10 |
0
|
28.06.2018, 11:31 | 11 |
0
|
28.06.2018, 11:31 | |
28.06.2018, 11:31 | |
Помогаю со студенческими работами здесь
11
Найти произведение целых частей и сумму дробных частей и вывести их на экран Разбиение web-приложения на множество частей и сбор этих частей на стороне клиента в Веб-браузере На сколько частей и как нужно разделить отрезок, чтобы произведение длин частей было максимальным Скрипт создания 7z архива: добавить дату к названию архива Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |