尝试使用.NET框架中包含的GZipStream类解压缩(.gz)文件时出现异常。我正在使用MSDN文档。这是例外:
不支持写入压缩流。
以下是申请来源:
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); //<<Throws error here
// Close the stream.
compressedzipStream.Close();
Console.WriteLine("Original size: {0}, Compressed size: {1}", buffer.Length, ms.Length);
} catch {...}
在compressedZipStream.write()中抛出异常。
有什么想法吗?什么是这个例外告诉我的?
答案 0 :(得分:16)
它告诉您应该拨打Read
而不是Write
,因为它是解压缩!内存流也应该用数据构造,或者你应该直接将文件流传递给GZipStream构造函数。
应如何完成的示例(尚未尝试编译):
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
答案 1 :(得分:9)
压缩代码不像加密一样工作 - 您无法通过写入压缩数据从一个流解压缩到另一个流。您必须提供一个包含压缩数据的流,并让GZipStream
从中读取。像这样:
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
是一种简单的实用工具方法,用于从一个流中读取并将所有数据复制到另一个流中。像这样:
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);
}
}
答案 2 :(得分:1)
压缩流的工作原理一开始可能令人费解。
读取压缩数据并写入未压缩数据。总而言之,流确保您始终只“看到”未压缩的数据。
实现您要执行的操作的正确方法是使用GZipStream
进行阅读,然后使用GZipStream
进行编写。