在Stream中读取GZip压缩数据

时间:2012-01-31 09:52:23

标签: c# gzip

我的目标是使用gzip压缩文件,然后将压缩的字节写入Xml部分,这意味着我需要在代码中使用压缩的字节数组。我发现GZip的所有示例都只是将字节直接写入文件。

所以这是我的代码:

public ContainerFile(string[] inputFiles, string Output)
    {
        XmlDocument doc = new XmlDocument();
        XmlNode root;

        FileInfo fi;
        FileStream fstream;
        BinaryReader reader;
        GZipStream gstream;



        root = doc.CreateElement("compressedFile");
        doc.AppendChild(root);

        foreach (string f in inputFiles)
        {
            fstream = File.OpenRead(f);
            MemoryStream s = new MemoryStream();

            byte[] buffer = new byte[fstream.Length];
            // Read the file to ensure it is readable.
            int count = fstream.Read(buffer, 0, buffer.Length);
            if (count != buffer.Length)
            {
                fstream.Close();
                //Console.WriteLine("Test Failed: Unable to read data fromfile");
            return;
            }
            fstream.Close();

            gstream = new GZipStream(s, CompressionMode.Compress, true);
            gstream.Write(buffer, 0, buffer.Length);
            gstream.Flush();


            byte[] bytes = new byte[s.Length];

            s.Read(bytes, 0, bytes.Length);

            File.WriteAllBytes(@"c:\compressed.gz", bytes);

        }

出于调试原因,我只是在加载后尝试将数据写入文件。

因此,输入文件的长度约为4k字节。正如degubber告诉我的那样,“bytes” - 数组的长度约为2k。因此看起来压缩字节数组的大小是正确的,但其中的所有值都是0。

可以s.o.帮帮我?

1 个答案:

答案 0 :(得分:4)

您的Read来电正试图从MemoryStream结尾中读取 - 您还没有“重绕”它。您可以使用s.Position = 0;执行此操作 - 但只需拨打MemoryStream.ToArray即可。

请注意,我会亲自尝试从流中读取,假设整个数据可以一次性使用,就像您开始时一样。您还应该对流使用using语句,以避免在抛出异常时泄漏句柄。但是,使用File.ReadAllBytes无论如何都会更简单:

byte[] inputData = File.ReadAllBytes();
using (var output = new MemoryStream())
{
    using (var compression = new GZipStream(output, CompressionMode.Compress,
                                            true))
    {
        compression.Write(inputData, 0, inputData.Length);
    }
    File.WriteAllBytes(@"c:\compressed.gz", output.ToArray());
}

目前尚不清楚为什么你在这里首先使用MemoryStream,因为你正在将数据写入文件......