Come to find out, those are stripped after the file is written to disc, so the compression never hits. What I found to be the simplest thing to do is to just override the IDataBus/FileShareDataBus altogether. IDataBus has a couple of simple methods, Get and Put to override. I used the existing FileShareDataBus as a model and just injected some simple compression. Let's start with Put:
public string Put(Stream stream, TimeSpan timeToBeReceived)
{
var key = GenerateKey(timeToBeReceived);
var filePath = Path.Combine(basePath, key);
Directory.CreateDirectory(Path.GetDirectoryName(filePath));
var outStream = new FileStream(filePath, FileMode.CreateNew);
using (var tinyStream = new GZipStream(outStream, CompressionMode.Compress))
{
var buffer = new byte[32 * 1024];
Int32 read = 0;
while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
{
tinyStream.Write(buffer, 0, read);
}
}
return key;
}
Note that all I really did was slip in the GZipStream. Now for Get:
public Stream Get(String key)
{
var bigStreamOut = new MemoryStream();
using (var bigStream = new GZipStream(File.OpenRead(Path.Combine(this.basePath, key)), CompressionMode.Decompress))
{
bigStream.CopyTo(bigStreamOut);
}
bigStreamOut.Position = 0;
return bigStreamOut;
}
Lastly all we need is a little bit of configuration magic:
public static class ConfigureCompressedFileShareDataBus
{
public static Configure CompressedFileShareDataBus(this Configure config, String basePath)
{
var bus = new CompressedFileShareDataBus(basePath);
config.Configurer.RegisterSingleton<IDataBus>(bus);
return config;
}
}
Now we have a heck of a lot less data on the network...enjoy!
No comments:
Post a Comment