2014-09-20 3 views
0

У меня есть этот кодC# Распаковка .GZip в файл

using System.IO; 
using System.IO.Compression; 
... 
UnGzip2File("input.gz","output.xls"); 

Какой запустить эту процедуру, она работает без ошибок, но после этого, input.gz пуст и создал output.xls также пуст. В начале ввода.gz было 12 МБ. Что я делаю не так ? Или у вас лучшее/функциональное решение?

public static void UnGzip2File(string inputPath, string outputPath) 
     { 
      FileStream inputFileStream = new FileStream(inputPath, FileMode.Create); 
      FileStream outputFileStream = new FileStream(outputPath, FileMode.Create); 

      using (GZipStream gzipStream = new GZipStream(inputFileStream, CompressionMode.Decompress)) 
      { 
       byte[] bytes = new byte[4096]; 
       int n; 

       // To be sure the whole file is correctly read, 
       // you should call FileStream.Read method in a loop, 
       // even if in the most cases the whole file is read in a single call of FileStream.Read method. 

       while ((n = gzipStream.Read(bytes, 0, bytes.Length)) != 0) 
       { 
        outputFileStream.Write(bytes, 0, n); 
       } 
      } 

      outputFileStream.Dispose(); 
      inputFileStream.Dispose(); 
     } 
+4

Когда вы открываете файл для чтения, вы не должны использовать опцию «Создать». –

+1

Обязательно используйте 'using' для всех ресурсов. Я не знаю, почему люди все еще не делают этого в 2014 году, хотя для этого нет никаких недостатков. – usr

+0

usr: Хорошо, спасибо за подсказку. Я нахожу, что преимущество использования блока заключается в том, что оно утилизируется даже по ошибке. – Muflix

ответ

0

Открытие FileStream с FileMode.Create перезаписывает существующий файл как описано here. Это приведет к тому, что файл будет пустым, когда вы попытаетесь его распаковать, что, в свою очередь, приведет к пустым выходным файлам.

Ниже приведен пример рабочего кода, обратите внимание, что он асинхронный, его можно изменить, оставив асинхронный/ожидающий и изменив вызов на обычный метод CopyTo и изменив тип возврата на void.

public static async Task DecompressGZip(string inputPath, string outputPath) 
{ 
    using (var input = File.OpenRead(inputPath)) 
    using (var output = File.OpenWrite(outputPath)) 
    using (var gz = new GZipStream(input, CompressionMode.Decompress)) 
    { 
     await gz.CopyToAsync(output); 
    } 
} 
+0

Спасибо, это намного проще. – Muflix

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