2016-08-11 9 views
1

Кто-нибудь знает, почему я получаю сообщение об ошибке «Неожиданный конец данных» при отключении gzip-файла?GZipStream делает gzipping, но ungzipping файл заканчивается «Неожиданным завершением данных»

Чтобы проверить, что данные в байтах не повреждены, я использую FooTest4.csv для записи в файл и смог успешно открыть файл.

Оба «FooTest3.csv.gz» and 'FooTest2.csv.gz столкнулись с «Неожиданным концом данных» при не-gzipping.

public static List<byte> CompressFile(List<byte> parmRawBytes) 
    { 
     //Initialize variables... 
     List<byte> returnModifiedBytes = null; 

     File.WriteAllBytes(@"X:\FooTest4.csv", parmRawBytes.ToArray()); 

     using (var memoryStream = new MemoryStream()) 
     { 
      using (var gzipStream = new GZipStream(memoryStream, CompressionMode.Compress, false)) 
      { 
       gzipStream.Write(parmRawBytes.ToArray(), 0, parmRawBytes.ToArray().Length); 
       gzipStream.Flush(); 
       File.WriteAllBytes(@"X:\FooTest3.csv.gz", memoryStream.ToArray()); 
       returnModifiedBytes = memoryStream.ToArray().ToList(); 
      } 
     } 

     File.WriteAllBytes(@"X:\FooTest2.csv.gz", returnModifiedBytes.ToArray()); 

     return returnModifiedBytes; 
    } 
+2

Вы вызываете 'memoryStream.ToArray()' преждевременно: 'GZipStream.Dispose' записывает вещи в свой базовый поток. Удалите вызов 'gzipStream.Flush' (который является спорным) и вытащите вызов' memoryStream.ToArray() 'из-под внутреннего блока' using'. – ach

+0

Потяните вызов 'memoryStream.ToArray()', что вы подразумеваете под этим? – fletchsod

+0

Поместите его во внешний блок 'using', но вне внутреннего:' using (var memoryStream = ...) {using (var gzipStream = ...) {gzipStream.Write (...); } memoryStream.ToArray(); } '. – ach

ответ

0

GZipStream необходимо закрыть, чтобы он мог записать некоторые завершающие данные в конец буфера для завершения кодирования gzip.

byte[] inputBytes = ...; 
using (var compressedStream = new MemoryStream()) 
{ 
    using (var compressor = new GZipStream(compressedStream, CompressionMode.Compress)) 
    { 
     compressor.Write(inputBytes, 0, inputBytes.Length); 
    } 

    // get bytes after the gzip stream is closed 
    File.WriteAllBytes(pathToFile, compressedStream.ToArray()); 
} 
+0

Давая вам очки, так что старая почта может быть закрыта. Я не помню, что я сделал, чтобы он работал год назад. :-) – fletchsod

0

Вместо того, чтобы загружать байты, сжимать и сохранять их, вы можете делать сжатие и запись сразу. Также я не знаю, почему вы используете List<Byte> вместо byte[], может быть, это может быть так.

void CompressFile(string inputPath, string outputPath) 
{ 
    Stream readStream = new FileStream(inputPath, Filemode.Open); 
    Stream writeStream = new FileStream(outputPath, FileMode.Create); 
    Stream compressionStream = new GZipStream(writeStream. CompressionMode.Compress); 
    byte[] data = new byte[readStream.Length]; 
    readStream.Read(data, 0, data.Length); 
    compressionStream.Write(data, 0, data.Length); 
    readStream.Close(); 
    writeStream.Close();  
} 

byte[] CompressFile(string inputPath) 
{ 
    byte[] data = File.ReadAllBytes(inputPath); 
    MemoryStream memStream = new MemoryStream(data); 
    var gzipStream = new GZipStream(memStream, CompressionMode.Compress); 
    gzipStream.Write(data, 0, data.Length); 
    gzipStream.Close(); 
    return gzipStream.ToArray(); 
} 

PS: Я написал код в текстовом редакторе, поэтому могут быть ошибки. Также вы говорите, что ошибка находится на «unzippiing», почему бы вам не показать код для распаковки?

+0

Не хотите писать на диск, просто пишите только в памяти. – fletchsod

+0

Но на ваш код вы пишете на диск. Я отредактирую ответ. – null

+0

Эта часть для отладки. Возвращаемое значение возвращает данные байта. Ну что ж. – fletchsod

 Смежные вопросы

  • Нет связанных вопросов^_^