读取流中的GZip压缩数据

本文关键字:压缩 数据 GZip 读取 | 更新日期: 2023-09-27 18:21:54

我的目标是使用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向我展示的那样,"字节"数组的长度约为2k。因此,看起来压缩字节数组的大小是正确的,但其中的所有值都是0。

s.o.能帮我吗?

读取流中的GZip压缩数据

您的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,因为您要将数据写入一个文件。。。