public void Handle(FileChunkRequest message)
{
string filePath = Path.Combine(this.expanderSharedFiles, message.Type.ToString(), message.FileName);
long fileSize = new FileInfo(filePath).Length;
int chunkId = (int)(message.ChunkStart / message.ChunkSize);
int chunks = (int)(fileSize / message.ChunkSize);
log.Info("Request for file {0} chunk {1}/{2} for {3:N0} bytes", message.FileName, chunkId, chunks, message.ChunkSize);
using (var fs = File.OpenRead(filePath))
{
fs.Seek(message.ChunkStart, SeekOrigin.Begin);
int bytesToRead = Math.Min(message.ChunkSize, (int)(fs.Length - message.ChunkStart));
if (bytesToRead <= 0)
return;
byte[] chunk = new byte[bytesToRead];
fs.Read(chunk, 0, chunk.Length);
SendMessage(new FileChunkResponse
{
DownloadId = message.DownloadId,
ChunkStart = message.ChunkStart,
Chunk = chunk
});
}
}