2012-05-14 5 views
0

Я получаю исключение IO «Размер потока в нижнем колонтитуле GZip не соответствует реальному размеру потока» при распаковке из GzipStream. Эта ошибка составляет 100% времени для нескольких файлов, поэтому я не считаю, что это «реальная» проблема с поврежденным файлом.Размер потока в нижнем колонтитуле GZip не соответствует реальному размеру потока

код сжатия выглядит следующим образом:

using (var fileStream = fileInfo.OpenRead()) 
      { 
       using (var outFile = File.Create(Path.Combine(backupLocation, backupFileName.ToString()))) 
       { 
        using (var gzCompressionStream = new GZipStream(outFile, CompressionMode.Compress)) 
        { 
         fileStream.CopyTo(gzCompressionStream); 
        } 
       } 
      } 

Декомпрессия код, который бросает исключение выглядит следующим образом:

using (var fileStream = fileInfo.OpenRead()) 
      { 
       // remove the extension 
       var fileName = fileInfo.Name; 
       var originalName = fileName.Remove(fileName.Length - fileInfo.Extension.Length); 

       using (var outFile = File.Create(Path.Combine(transferLocation, originalName))) 
       { 
        using (var gzDecompressionStream = new GZipStream(fileStream,CompressionMode.Decompress)) 
        { 
         gzDecompressionStream.CopyTo(outFile); 
        } 
       } 
      } 
+0

Код выглядит разумным. Вы подтвердили, что имена файлов ожидаются (т. Е. Проверьте один файл с жестко запрограммированным сжатием имени -> распаковать)? –

+0

Извините, не совсем уверен, что я следую за вами, как бы имя файла повлияло на декомпрессию? – Johnv2020

+0

I.e. Сжатие: «Source.txt» -> «compress.compr», декомпрессии: «random.file» (вместо «compress.compr») -> «Source.txt» (сбой, поскольку «random.file» не сжимается при все). –

ответ

1

Все, спасибо за вашу помощь - выглядит как я нашел проблема. Я получаю сообщение об ошибке, когда размер сжатого файла превышает 4 ГБ, ниже все работает нормально, - это не должно быть проблемой, поскольку MSDN утверждает, что GZipStream работает с файлами размером до 8 ГБ с .Net 4 (который я 'm), а максимальный размер файла всегда будет ниже 6 ГБ (предел приложения). Предыдущие версии GZipStream поддерживали только до 4 ГБ - похоже, что в этом случае документация MSDN неверна.

+1

Это еще одна ошибка в GZipStream. Последние четыре байта потока gzip - это несжатая (не сжатая) длина по модулю 2^32, как проверка данных. Если низкие 32 бита длины того, что было несжатым, совпадают, тогда проверка хороша. –

+0

Я видел много других проблем с GZipStream здесь, на SO. Среди них заключается в том, что он неправильно использует фиксированные и динамические по сравнению с хранимыми блоками, что приводит к слишком большому сжатому выходу для короткого ввода, а несоответствия crc часто не обнаруживаются, что приводит к ошибке при возникновении серьезной ошибки. Я бы рекомендовал, чтобы этот класс из Microsoft никогда не использовался. –