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