如何将其转换为读取zip文件?

时间:2014-04-10 09:47:10

标签: c# unzip memorystream

我正在从磁盘读取解压缩的二进制文件,如下所示:

string fn = @"c:\\MyBinaryFile.DAT";
byte[] ba = File.ReadAllBytes(fn);
MemoryStream msReader = new MemoryStream(ba);

我现在想通过使用压缩的二进制文件来提高I / O的速度。但是我如何将其纳入上述模式?

string fn = @"c:\\MyZippedBinaryFile.GZ";
//Put something here
byte[] ba = File.ReadAllBytes(fn);
//Or here
MemoryStream msReader = new MemoryStream(ba);

实现这一目标的最佳方式是什么。

我需要最终得到一个MemoryStream,因为我的下一步是反序列化它。

1 个答案:

答案 0 :(得分:1)

您必须对文件内容使用GZipStream

所以基本上它应该是这样的:

string fn = @"c:\\MyZippedBinaryFile.GZ";
byte[] ba = File.ReadAllBytes(fn);
using (MemoryStream msReader = new MemoryStream(ba))
using (GZipStream zipStream = new GZipStream(msReader, CompressionMode.Decompress))
{
    // Read from zipStream instead of msReader
}

要考虑flindenberg的有效评论,您还可以直接打开文件,而无需先将整个文件读入内存:

string fn = @"c:\\MyZippedBinaryFile.GZ";
using (FileStream stream = File.OpenRead(fn))
using (GZipStream zipStream = new GZipStream(stream, CompressionMode.Decompress))
{
    // Read from zipStream instead of stream
}

你需要最终得到一个内存流?没问题:

string fn = @"c:\\MyZippedBinaryFile.GZ";
using (FileStream stream = File.OpenRead(fn))
using (GZipStream zipStream = new GZipStream(stream, CompressionMode.Decompress))
using (MemoryStream ms = new MemoryStream()
{
    zipStream.CopyTo(ms);
    ms.Seek(0, SeekOrigin.Begin); // don't forget to rewind the stream!

    // Read from ms
}