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;
    }
}
4

1 に答える 1

7

ストリームをデコンプレッサに渡す前にマジックナンバーを読んだようです(すでに読んでいるので、マジックナンバーは読めません)。

stream.Seek(0,SeekOrigin.Begin)解凍する前に使用してください。

于 2013-01-07T18:36:18.377 に答える