В net 3.5 есть ограничения на использование GZipStream, а именно размер содержащихся в нем данных не должен превышать 4gb.
Мне нужно использовать .net 3.5 для упаковки и распаковки файлов превышающих этот объем используя GZipStream.
Я уже практически все перепробовал, и создание собственных буфферов и BufferedStream но никак не получается запаковать нужный мне файл.
Гуглинг тоже не помог. Что делать? Ответ "это не возможно" не ответ, так как это так сказать обучающая задача и решение должно быть.
Спасибо.
Здравствуйте, cvetkov, Вы писали:
C>Только если разбить на куски, зазиповать куски и результат объединить. C>Никакой стандартный разжимальщик это конечно не съест.
А можете привести пример, как можно так запаковать, что бы программа своим процессом не занимала каждый из этих файлов и в итоге их можно было бы удалить?
Здравствуйте, -n1l-, Вы писали:
N>Мне нужно использовать .net 3.5 для упаковки и распаковки файлов превышающих этот объем используя GZipStream. N>Я уже практически все перепробовал, и создание собственных буфферов и BufferedStream но никак не получается запаковать нужный мне файл. N>Гуглинг тоже не помог.
...its file format also allows for multiple such streams to be concatenated (zipped files are simply decompressed concatenated as if they were originally one file[²])
То есть надо просто сжимать исходные данные кусками, не превышающими ограничения в 4GB, и записывать результаты в файл один за другим. В результате получится валидный gzip-архив, распаковка которого будет давать исходные данные.
Здравствуйте, cvetkov, Вы писали:
C>Только если разбить на куски, зазиповать куски и результат объединить. C>Никакой стандартный разжимальщик это конечно не съест.
Здравствуйте, -n1l-, Вы писали:
N>А можете привести пример, как можно так запаковать, что бы программа своим процессом не занимала каждый из этих файлов и в итоге их можно было бы удалить?
Здравствуйте, nikov, Вы писали:
N>То есть надо просто сжимать исходные данные кусками, не превышающими ограничения в 4GB, и записывать результаты в файл один за другим. В результате получится валидный gzip-архив, распаковка которого будет давать исходные данные.
Так я так их и сжимал, создавал буффер, записывал в него данные из файла, передавал его для записи gzipstream. И все было круто, пока файл, с которым работал gzip не становился больше 4GB.
Здравствуйте, nikov, Вы писали:
C>>Только если разбить на куски, зазиповать куски и результат объединить. C>>Никакой стандартный разжимальщик это конечно не съест.
N>На самом деле съест. Это фича формата gzip.
Здравствуйте, cvetkov, Вы писали:
C>Здравствуйте, nikov, Вы писали:
C>>>Только если разбить на куски, зазиповать куски и результат объединить. C>>>Никакой стандартный разжимальщик это конечно не съест.
N>>На самом деле съест. Это фича формата gzip.
C>а как он узнает что новый кусок начался?
Вот кстати у меня как раз с этим проблема. Дело в том, что gzip определенным образом изменяет файл добавляя в него свои какие-то оповестительные знаки о начале и конце. Всеми возможными 7zipами я могу открыть файл, а вот gzipstream'ом не могу, так как он найдя первый знак оповещающий о конце первого куска заканчивает обработку потока.
Здравствуйте, -n1l-, Вы писали:
N>Так я так их и сжимал, создавал буффер, записывал в него данные из файла, передавал его для записи gzipstream. И все было круто, пока файл, с которым работал gzip не становился больше 4GB.
Надо создавать отдельный инстанс GZipStream для каждого куска.
Здравствуйте, -n1l-, Вы писали:
N>Вот кстати у меня как раз с этим проблема. Дело в том, что gzip определенным образом изменяет файл добавляя в него свои какие-то оповестительные знаки о начале и конце. Всеми возможными 7zipами я могу открыть файл, а вот gzipstream'ом не могу, так как он найдя первый знак оповещающий о конце первого куска заканчивает обработку потока.
GZipStream — это не полноценный архиватор, он предназначен для распаковки одного сжатого stream-а. Файл формата gzip может содержать несколько stream-ов подряд, соответственно, для каждого из них надо создавать отдельный инстанс GZipStream.
...its file format also allows for multiple such streams to be concatenated (zipped files are simply decompressed concatenated as if they were originally one file[²])
A gzip file consists of a series of "members" (compressed data
sets). The format of each member is specified in the following
section. The members simply appear one after another in the file,
with no additional information before, between, or after them.
Здравствуйте, nikov, Вы писали:
N>Здравствуйте, -n1l-, Вы писали:
N>>Так я так их и сжимал, создавал буффер, записывал в него данные из файла, передавал его для записи gzipstream. И все было круто, пока файл, с которым работал gzip не становился больше 4GB.
N>Надо создавать отдельный инстанс GZipStream для каждого куска.
И что с ним делать? Вы вообще его хоть раз пользовали на практике? Если файл больше 4гб, то плевать, все стримы перестают работать.
Если для каждого куска по стриму, то тогда получается много файлов.
В памяти куски хранить нельзя, он их не сживает. Хз почему, но когда я пробовал memorystream или bufferstream, он ничего не сжал.
Здравствуйте, nikov, Вы писали:
N>Здравствуйте, -n1l-, Вы писали:
N>>Вот кстати у меня как раз с этим проблема. Дело в том, что gzip определенным образом изменяет файл добавляя в него свои какие-то оповестительные знаки о начале и конце. Всеми возможными 7zipами я могу открыть файл, а вот gzipstream'ом не могу, так как он найдя первый знак оповещающий о конце первого куска заканчивает обработку потока.
N>GZipStream — это не полноценный архиватор, он предназначен для распаковки одного сжатого stream-а. Файл формата gzip может содержать несколько stream-ов подряд, соответственно, для каждого из них надо создавать отдельный инстанс GZipStream.
N>http://en.wikipedia.org/wiki/Gzip
N>
N>...its file format also allows for multiple such streams to be concatenated (zipped files are simply decompressed concatenated as if they were originally one file[²])
N> A gzip file consists of a series of "members" (compressed data
N> sets). The format of each member is specified in the following
N> section. The members simply appear one after another in the file,
N> with no additional information before, between, or after them.
Скажите, я правильно понимаю, что есть разница в каком порядке мне записывать ужатые куски?
N> A gzip file consists of a series of "members" (compressed data
N> sets). The format of each member is specified in the following
N> section. The members simply appear one after another in the file,
N> with no additional information before, between, or after them.
Если я пытаюсь записать в файл второй gzipstream, то получаю ошибку, что файл закрыт от записи.
Здравствуйте, -n1l-, Вы писали:
N>Если я пытаюсь записать в файл второй gzipstream, то получаю ошибку, что файл закрыт от записи. N>В общем сконкатенировать gzipstream'ы в одном файле мне не представляется возможным.
Надо написать свой Stream-прослойку, который будет держать файл открытым.
Нельзя вот так объявлять задачу нерешаемой при обнаружении малейшей трудности. Ты же программист, твоя задача — заставить инструменты делать то, что тебе нужно.
Здравствуйте, -n1l-, Вы писали:
N>В общем сконкатенировать gzipstream'ы в одном файле мне не представляется возможным. N>Так что я вернусь к идее записи в несколько файлов.