2009-10-17 6 views
8

tôi có mã rằng nên làm như nén:GZipStream và giải nén

 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(); 

và tôi nghĩ rằng nó làm, nhưng tôi muốn giải nén những gì đã nén cách trên. Tôi làm điều gì đó giống như vậy:

 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(); 

và ở đây nó không ... Tôi đã có nRead = 0 bị bỏ qua vòng lặp ... Tôi làm gì sai ?? Tệp kiểm tra tôi sử dụng là tệp TEXT đơn giản nhất (kích thước: 104 byte) ...

+0

câu trả lời Edited để hiển thị cả đọc và viết –

+5

Cũng lưu ý rằng gzip = ".zip" –

+0

(lưu ý tôi cố định một lỗi sau khi công bố;! Cheack rằng cả hai 'while' vòng chỉ' Đọc' trên dòng trên cùng (không phải ở phía dưới là tốt). –

Trả lời

13

Suy nghĩ đầu tiên của tôi là bạn chưa đóng csStream. Nếu bạn sử dụng using điều này xảy ra tự động. Vì gzip đệm dữ liệu, bạn có thể bị thiếu một số dữ liệu.

Thứ hai; không tăng offset; đó là độ lệch trong bộ đệm (không phải luồng). Rời khỏi 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

Vấn đề là hồi quy hoạt động tốt, nhưng không thể làm cho nó giải nén. –

+0

Nó hoạt động !!! Cảm ơn! –

+4

Thay vì vòng lặp đệm, bạn cũng có thể sử dụng hàm built in .CopyTo() Trong trường hợp này nó sẽ là: csStream.CopyTo (fd); –

-1

Hai phương pháp tôi có giống như James Roland đã đề cập.

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(); 
} 

Tuy nhiên, tôi đang sử dụng tải lên với

Request.Files[0] 

sau đó nén và lưu vào db. Sau đó, tôi kéo img ra, giải nén và cài đặt một src với

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

Không bao giờ sử dụng đối tượng 'IDisposable' mà không sử dụng'! –