#c# #zlib
#c# #zlib
Вопрос:
Привет, у меня возникли проблемы со сжатием файлов с помощью Ionic.zlib, я новичок в C #, поэтому проблема может быть легко разрешима. Если я сжимаю большой файл, скажем, размером 500 кб, то, как только сжатый файл достигнет 65536 байт, он остановится, если я затем распаковываю файл, в нем отсутствует много данных : /. Я могу исправить это, установив для буфера значение, равное 4 000 000, но я слышал, что лучше всего установить для него значение 0x4000.
ZlibStream compressor = new ZlibStream(gsc_stream, CompressionMode.Compress, CompressionLevel.BestCompression, true);
byte[] buffer = new byte[0x4000];
Int32 n;
int previous = Convert.ToInt32(zone.Position);
while ((n = compressor.Read(buffer, 0, buffer.Length)) != 0)
{
zone.Write(buffer, 0, n);
}
zone.Flush();
compressor.Flush();
Ответ №1:
Похоже, у вас все наоборот.
Если вы пытаетесь сжать файл в потоке gsc_stream
и записать результат в поток zone
, тогда правильный код будет:
using (ZlibStream compressor = new ZlibStream(zone, CompressionMode.Compress, CompressionLevel.BestCompression, true))
{
byte[] buffer = new byte[0x4000];
int n;
while ((n = gsc_stream.Read(buffer, 0, buffer.Length)) != 0)
{
compressor.Write(buffer, 0, n);
}
zone.Flush();
compressor.Flush();
}
Комментарии:
1. У него даже больше нет заголовка zlib, и он сжимает части файла, которые я ему не указывал. Эй, по крайней мере, он сделал больше, чем 65536 байт.
2. Верхняя часть зоны не сжимается, как только в файл записывается первый gsc_stream, с этого момента сжимается остальная часть файла, за исключением начала, с которого это было сделано, до того, как зона положения была четной, и, как я уже сказал, заголовка zlib вообще нет.
3. @Levi
gsc_stream
должно быть что-то вроде:gsc_stream = System.IO.File.OpenRead(fileToCompress);
4. Это предназначено для открытия gsc_stream и записи его сжатой версии в зону, вот вся моя функция для записи файлов gsc в зону. Добавил это в первый пост.
5. Я сделал то, что вы сказали, и установил для flushmode значение partial, но теперь он сжимает только 75 кб байт :/.