Действительно ли я вынужден читать ReadToEnd () StreamReader, читающий Ionic.Zlib.GZipStream? - PullRequest
9 голосов
/ 18 сентября 2011

Я использую следующий код для распаковки GZipStream (используя библиотека DotNetZip ), где fs - это файловый поток, указывающий на файл gz (с FileMode.Open, FileAccess.Read, FileShare.ReadWrite):

using (var gz = new GZipStream(fs, CompressionMode.Decompress)) {
    using (var sr = new StreamReader(gz)) {
         header = sr.ReadLine();
    }
}

Но если файл не читается до конца (что я предпочитаю делать, когда он не нужен, так как файл может быть огромным), он выдает

ZlibException("Bad CRC32 in GZIP trailer. (actual(EC084966)!=expected(8FC3EF16))")

в первой закрывающей скобке (на самом деле при попытке закрыть () StreamReader.

Теперь, если вызов ReadToEnd () перед закрытием потокового читателя (или я читаю все строки, используя некоторое время (! Sr.EndOfStream))цикл), он работает. Я наблюдал такое же поведение со сжатым файлом размером 500 МБ и 200 КБ, поэтому кажется, что он не связан с размером файла.

Ваше понимание очень приветствуется!

Вот ссылка на простой выделенный тестовый проект .

Он работает с библиотекой System.IO.GZipStream, так что это очень странно.

Ответы [ 2 ]

4 голосов
/ 18 сентября 2011

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

Однако это не объясняет, почему это работает при использовании System.IO.GzipStream.

. Я нашел соответствующую часть исходного кода DotNetZip здесь , но, похоже, они проверяют, что потокчитается до конца (см. // Make sure we have read to the end of the stream).Затем они вычисляют CRC32, как показано в сообщении об исключении.

0 голосов
/ 26 мая 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...