文件加载失败 - GZip头中的魔数不正确。

4
我正在尝试创建一个保存/加载类,该类具有保存和加载压缩文件的选项。以下是我目前的代码。通过调试,它似乎工作得很好,但是却出现了“GZip头中的魔数不正确”的异常。我不明白这是怎么回事,因为我在传递数据之前已经检查过是否存在这个数字,并且我已经通过外部程序验证它是一个GZip文件。
如果您能帮助我找出我做错了什么地方,我将不胜感激。对我的代码进行建设性的批评总是受欢迎的-谢谢!
public static class SaveLoad
{
    public static void Save(string fileName, object savefrom, bool compress)
    {
        FileStream stream = new FileStream(fileName, FileMode.Create);

        BinaryFormatter formatter = new BinaryFormatter();
        if (compress)
        {
            GZipStream compressor = new GZipStream(stream, CompressionMode.Compress);
            formatter.Serialize(compressor, savefrom);
            compressor.Close();
        }
        else { formatter.Serialize(stream, savefrom); }

        stream.Close();
    }

    public static object Load(string fileName)
    {
        object loadedObject = null;

        try
        {
            FileStream stream = new FileStream(fileName, FileMode.Open);

            BinaryFormatter formatter = new BinaryFormatter();

            if (stream.Length > 4)
            {
                byte[] data = new byte[4];
                stream.Read(data, 0, 4);

                if (BitConverter.ToUInt16(data, 0) == 0x8b1f) //GZIP_LEAD_BYTES == 0x8b1f
                {
                    GZipStream decompressor = new GZipStream(stream, CompressionMode.Decompress);
                    loadedObject = formatter.Deserialize(decompressor); //Exception
                    decompressor.Close();
                }
                else { loadedObject = formatter.Deserialize(stream); }
            }
            stream.Close();
        }
        catch (Exception e)
        {
            Logger.StaticLog.AddEvent(new Logger.lEvent(null, Logger.lEvent.EventTypes.Warning, "Failed to load file: " + fileName, e)
            {
                SendingObject = "SaveLoad"
            });
            Logger.StaticLog.WriteLog();
            throw;
        }

        return loadedObject;
    }
}

2
看起来你需要回到位置0,以便GZipStream可以读取你已经读取的前4个字节。 - Joachim Isaksson
请看一下我的答案 - Choletski
1个回答

7

在传递流给解压缩器之前,似乎您已经读取了魔数(但解压缩器不会读取魔数,因为您已经读取过它)。

在解压缩之前使用 stream.Seek(0,SeekOrigin.Begin) 进行定位。


太棒了,谢谢!!!我还需要5分钟才能将其标记为答案,但它有效! - Anthony Nichols

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接