using System.IO; using System; using System.IO.Compression; using System.Text; namespace AyrA.IO { /// /// Compresses or decompresses files into a blob /// public static class Compressor { /// /// Compress a list of files into a blob /// /// During compression, the path information is lost /// Full file names. /// Destination stream public static void Compress(string[] Files, Stream Destination) { FileInfo[] FF = Array.ConvertAll(Files, delegate(string f) { return new FileInfo(f); }); using (GZipStream zip = new GZipStream(Destination, CompressionMode.Compress, true)) { using (BinaryWriter BW = new BinaryWriter(zip)) { BW.Write(Files.Length); foreach (FileInfo F in FF) { #if DEBUG Console.WriteLine("Compressing {0}", F.Name); #endif byte[] Data = File.ReadAllBytes(F.FullName); BW.Write(Encoding.UTF8.GetByteCount(F.Name)); BW.Write(Encoding.UTF8.GetBytes(F.Name)); BW.Write(Data.Length); BW.Write(Data); } } } } /// /// Decompresses files from a stream into a directory /// /// Destination directory /// Compressed source stream public static void Decompress(string Directory, Stream Source) { using (GZipStream GZ = new GZipStream(Source, CompressionMode.Decompress)) { using (BinaryReader BR = new BinaryReader(GZ)) { int Count = BR.ReadInt32(); for (int i = 0; i < Count; i++) { string FileName = Encoding.UTF8.GetString(BR.ReadBytes(BR.ReadInt32())); #if DEBUG Console.WriteLine("Decompressing {0}", FileName); #endif byte[] Content = BR.ReadBytes(BR.ReadInt32()); File.WriteAllBytes(Path.Combine(Directory, FileName), Content); } } } } } }