Charger le Fichier ne fonctionne Pas - Le nombre magique dans GZip-tête n'est pas correcte
Je tente de créer une sauvegarde/Chargement de la classe qui a l'option d'enregistrement de & charger des fichiers des fichiers compressés. Voici ce que j'ai jusqu'à présent. Marcher à travers elle semble fonctionner très bien, sauf que je "Le nombre magique dans GZip-tête n'est pas correcte" l'exception". Je ne comprends pas comment cela peut être comme je suis en vérifiant que le nombre est-il avant de me le faire passer, et j'ai vérifié via un programme externe que c'est un fichier GZip.
Toute aide à trouver où je suis allé mal serait appréciée. La critique Constructive de mon code est toujours la bienvenue - Merci!
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;
}
}
Il semble probable que vous auriez à chercher de retour à la position 0 pour permettre à GZipStream de lire les 4 premiers octets que vous avez déjà lu.
prendre un coup d'oeil à mon répondre
prendre un coup d'oeil à mon répondre
OriginalL'auteur Anthony Nichols | 2013-01-07
Vous devez vous connecter pour publier un commentaire.
Il semble que vous lisez le nombre magique avant de passer le flux de décompresseur (qui ne sera pas lire le nombre magique puis, parce que vous avez déjà lu).
Utilisation
stream.Seek(0,SeekOrigin.Begin)
avant de décompresser.OriginalL'auteur Anton Kovalenko