2009-10-17 3 views
8

У меня есть код, который должен сделать компрессию:GZipStream и декомпрессия

 FileStream fs = new FileStream("g:\\gj.txt", FileMode.Open); 
     FileStream fd = new FileStream("g:\\gj.zip", FileMode.Create); 
     GZipStream csStream = new GZipStream(fd, CompressionMode.Compress); 


     byte[] compressedBuffer = new byte[500]; 
     int offset = 0; 
     int nRead; 

     nRead = fs.Read(compressedBuffer, offset, compressedBuffer.Length); 
     while (nRead > 0) 
     { 
      csStream.Write(compressedBuffer, offset, nRead); 
      offset = offset + nRead; 
      nRead = fs.Read(compressedBuffer, offset, compressedBuffer.Length); 
     } 


     fd.Close(); 
     fs.Close(); 

, и я думаю, что это делает, но я хочу, чтобы разархивировать что сжимали выше способом. Я somethink так:

 FileStream fd = new FileStream("g:\\gj.new", FileMode.Create); 
     FileStream fs = new FileStream("g:\\gj.zip", FileMode.Open); 
     GZipStream csStream = new GZipStream(fs, CompressionMode.Decompress); 

     byte[] decompressedBuffer = new byte[500]; 
     int offset = 0; 
     int nRead; 

     nRead=csStream.Read(decompressedBuffer, offset, decompressedBuffer.Length); 
     while (nRead > 0) 
     { 
      fd.Write(decompressedBuffer, offset, nRead); 
      offset = offset + nRead; 
      nRead = csStream.Read(decompressedBuffer, offset, decompressedBuffer.Length); 
     } 

     fd.Close(); 
     fs.Close(); 

и здесь не ... У меня nRead = 0 befeore входя в петлю ... Что я делаю не так ?? Тестовый файл, который я использую, является самым простым файлом TEXT (размер: 104 байта) ...

+0

Edited ответ, чтобы показать, как читать и писать –

+5

Заметим также, что GZIP = «.zip» –

+0

(обратите внимание, я исправил ошибку после размещения;! Cheack что оба 'while' зацикливают только' Read' на верхней строке (а не на дне). –

ответ

13

Моя первая мысль заключается в том, что вы не закрыли csStream. Если вы используете using, это происходит автоматически. Поскольку данные буферов gzip, вы можете пропустить некоторые из них.

Во-вторых; не увеличивать offset; то есть смещение в буфере (не поток). Оставьте на 0:

using (Stream fs = File.OpenRead("gj.txt")) 
using (Stream fd = File.Create("gj.zip")) 
using (Stream csStream = new GZipStream(fd, CompressionMode.Compress)) 
{ 
    byte[] buffer = new byte[1024]; 
    int nRead; 
    while ((nRead = fs.Read(buffer, 0, buffer.Length))> 0) 
    { 
     csStream.Write(buffer, 0, nRead); 
    } 
} 

using (Stream fd = File.Create("gj.new.txt")) 
using (Stream fs = File.OpenRead("gj.zip")) 
using (Stream csStream = new GZipStream(fs, CompressionMode.Decompress)) 
{ 
    byte[] buffer = new byte[1024]; 
    int nRead; 
    while ((nRead = csStream.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     fd.Write(buffer, 0, nRead); 
    } 
} 
+0

Проблема в том, что commression работает хорошо, но не может сделать это для распаковки. – 2009-10-17 08:12:38

+0

Это работает !!! Спасибо! – 2009-10-17 08:15:52

+4

Вместо буферный цикл, вы также можете использовать встроенную функцию .CopyTo(). В этом случае это будет: csStream.CopyTo (fd); –

-1

Два метода, которые у меня есть, как упоминается Джеймс Роланд.

private static byte[] Compress(HttpPostedFileBase file) 
{ 
    var to = new MemoryStream(); 
    var from = new GZipStream(to, CompressionMode.Compress); 
    file.InputStream.CopyTo(from); 
    from.Close(); 
    return to.ToArray(); 
} 

private byte[] Decompress(byte [] img) 
{ 
    var to = new MemoryStream(); 
    var from = new MemoryStream(img); 
    var compress = new GZipStream(from, CompressionMode.Decompress); 
    compress.CopyTo(to); 
    from.Close(); 
    return to.ToArray(); 
} 

Однако я использую загрузку с

Request.Files[0] 

затем сжать и сохранить в БД. Тогда я тяну из IMG, распаковывать и устанавливать с SRC

$"data:image/gif;base64,{ToBase64String(Decompress(img))}"; 
+0

Никогда не используйте объект 'IDisposable' без' использования'! –