using System; using System.IO; using System.IO.Compression; using System.Text; using System.Xml.Linq; namespace Barotrauma { public partial class SaveUtil { public static string SaveFolder = "Data"+Path.DirectorySeparatorChar+"Saves"; public delegate void ProgressDelegate(string sMessage); public static string TempPath { get { return Path.Combine(SaveFolder, "temp"); } } public static Stream DecompressFiletoStream(string fileName) { if (!File.Exists(fileName)) { DebugConsole.ThrowError("File \""+fileName+" doesn't exist!"); return null; } using (FileStream originalFileStream = new FileStream(fileName, FileMode.Open)) { MemoryStream decompressedFileStream = new MemoryStream(); using (GZipStream decompressionStream = new GZipStream(originalFileStream, CompressionMode.Decompress)) { decompressionStream.CopyTo(decompressedFileStream); return decompressedFileStream; } } } public static bool DecompressFile(string sDir, GZipStream zipStream, ProgressDelegate progress) { //Decompress file name byte[] bytes = new byte[sizeof(int)]; int Readed = zipStream.Read(bytes, 0, sizeof(int)); if (Readed < sizeof(int)) return false; int iNameLen = BitConverter.ToInt32(bytes, 0); bytes = new byte[sizeof(char)]; StringBuilder sb = new StringBuilder(); for (int i = 0; i < iNameLen; i++) { zipStream.Read(bytes, 0, sizeof(char)); char c = BitConverter.ToChar(bytes, 0); sb.Append(c); } string sFileName = sb.ToString(); if (progress != null) progress(sFileName); //Decompress file content bytes = new byte[sizeof(int)]; zipStream.Read(bytes, 0, sizeof(int)); int iFileLen = BitConverter.ToInt32(bytes, 0); bytes = new byte[iFileLen]; zipStream.Read(bytes, 0, bytes.Length); string sFilePath = Path.Combine(sDir, sFileName); string sFinalDir = Path.GetDirectoryName(sFilePath); if (!Directory.Exists(sFinalDir)) Directory.CreateDirectory(sFinalDir); using (FileStream outFile = new FileStream(sFilePath, FileMode.Create, FileAccess.Write, FileShare.None)) outFile.Write(bytes, 0, iFileLen); return true; } public static void DecompressToDirectory(string sCompressedFile, string sDir, ProgressDelegate progress) { using (FileStream inFile = new FileStream(sCompressedFile, FileMode.Open, FileAccess.Read, FileShare.None)) using (GZipStream zipStream = new GZipStream(inFile, CompressionMode.Decompress, true)) while (DecompressFile(sDir, zipStream, progress)) ; } } }