RestartableFileStream
Restartable FileStream.
using System.IO;
namespace Relativity.DataExchange.Data
{
internal class RestartableFileStream : Stream
{
private readonly string filename;
private FileStream stream;
private long restartPosition;
public override bool CanRead => stream.CanRead;
public override bool CanSeek => stream.CanSeek;
public override bool CanWrite => stream.CanWrite;
public override long Length => stream.Length;
public override long Position {
get {
return stream.Position;
}
set {
stream.Position = value;
}
}
public RestartableFileStream(string filename)
{
this.filename = filename;
stream = OpenFileStream(filename);
}
public void Restart()
{
stream.Dispose();
stream = OpenFileStream(filename);
stream.Seek(restartPosition, SeekOrigin.Begin);
}
public override void Flush()
{
stream.Flush();
}
public override long Seek(long offset, SeekOrigin origin)
{
return stream.Seek(offset, origin);
}
public override void SetLength(long value)
{
stream.SetLength(value);
}
public override int Read(byte[] buffer, int offset, int count)
{
restartPosition = stream.Position;
int result = stream.Read(buffer, offset, count);
restartPosition = stream.Position;
return result;
}
public override void Write(byte[] buffer, int offset, int count)
{
stream.Write(buffer, offset, count);
}
protected override void Dispose(bool disposing)
{
if (disposing)
stream.Dispose();
base.Dispose(disposing);
}
private static FileStream OpenFileStream(string filename)
{
return new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read, 32768, FileOptions.SequentialScan);
}
}
}