2009-08-30 19 views
6

Tôi đang cố gắng giải nén tệp (.gz) bằng lớp GZipStream được bao gồm trong khuôn khổ .NET. Tôi đang sử dụng tài liệu MSDN và tôi tiếp tục nhận được ngoại lệ này: "Ghi vào luồng nén không được hỗ trợ."Ghi vào luồng nén không được hỗ trợ. Sử dụng System.IO.GZipStream

Đây là nguồn ứng dụng:

try 
      { 

       var infile = new FileStream(@"C:\TarDecomp\TarDecomp\TarDecomp\bin\Debug\nick_blah-2008.tar.gz", FileMode.Open, FileAccess.Read, FileShare.Read); 
       byte[] buffer = new byte[infile.Length]; 
       // Read the file to ensure it is readable. 
       int count = infile.Read(buffer, 0, buffer.Length); 
       if (count != buffer.Length) 
       { 
        infile.Close(); 
        Console.WriteLine("Test Failed: Unable to read data from file"); 
        return; 
       } 
       infile.Close(); 
       MemoryStream ms = new MemoryStream(); 
       // Use the newly created memory stream for the compressed data. 
       GZipStream compressedzipStream = new GZipStream(ms, CompressionMode.Decompress, true); 
       Console.WriteLine("Decompression"); 
       compressedzipStream.Write(buffer, 0, buffer.Length); 
       // Close the stream. 
       compressedzipStream.Close(); 
       Console.WriteLine("Original size: {0}, Compressed size: {1}", buffer.Length, ms.Length); 

Trường hợp ngoại lệ được ném vào compressedZipStream.write().

Bất kỳ ý tưởng nào? Ngoại lệ này cho tôi biết điều gì? Cảm ơn!

Trả lời

14

Đó là nói với bạn rằng bạn nên gọi Read thay vì Write vì nó giải nén! Ngoài ra luồng bộ nhớ nên được xây dựng với dữ liệu, hay đúng hơn là bạn nên truyền luồng tệp trực tiếp đến hàm tạo GZipStream.

Ví dụ về cách nó nên đã được thực hiện (đã không cố gắng để biên dịch nó):

Stream inFile = new FileStream(@"C:\TarDecomp\TarDecomp\TarDecomp\bin\Debug\nick_blah-2008.tar.gz", FileMode.Open, FileAccess.Read, FileShare.Read); 
Stream decodedStream = new MemoryStream(); 
byte[] buffer = new byte[4096]; 

using (Stream inGzipStream = new GZipStream(inFile, CompressionMode.Decompress)) 
{ 
    int bytesRead; 
    while ((bytesRead = inGzipStream.Read(buffer, 0, buffer.Length)) > 0) 
     decodedStream.Write(buffer, 0, bytesRead); 
} 

// Now decodedStream contains the decoded data 
+0

Tôi đang cố gắng cảm ơn bạn. – Nick

+0

Người đàn ông của bạn .. Cảm ơn! – Nick

+0

Rất vui được trợ giúp. :) –

1

Làm thế nào nén suối làm việc có thể gây bối rối lúc đầu.

Đọc mất nén dữ liệu và văn bản mất không nén dữ liệu. Tất cả trong tất cả, luồng đảm bảo bạn chỉ "xem" dữ liệu chưa nén mọi lúc.

Cách thích hợp để đạt được những gì bạn đang cố gắng làm là đọc bằng cách sử dụng GZipStream và sau đó viết bằng cách sử dụng GZipStream cũng có.

9

Mã nén không hoạt động như mã hóa - bạn không thể giải nén từ luồng này sang luồng khác bằng cách ghi dữ liệu đã nén. Bạn phải cung cấp luồng có chứa dữ liệu đã nén và cho phép đọc GZipStream từ đó. Một cái gì đó như thế này:

using (Stream file = File.OpenRead(filename)) 
using (Stream gzip = new GZipStream(file, CompressionMode.Decompress)) 
using (Stream memoryStream = new MemoryStream()) 
{ 
    CopyStream(gzip, memoryStream); 
    return memoryStream.ToArray(); 
} 

CopyStream là một phương pháp tiện ích đơn giản để đọc từ một luồng và sao chép tất cả dữ liệu sang một luồng khác. Một cái gì đó như thế này:

static void CopyStream(Stream input, Stream output) 
{ 
    byte[] buffer = new byte[8192]; 
    int bytesRead; 
    while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     output.Write(buffer, 0, bytesRead); 
    } 
} 
Các vấn đề liên quan