Вы можете реализовать класс Stream
, который ограничивает длину базового Stream
объекта (FileStream
в вашем случае) :
public class LengthLimitedStream : Stream
{
private Stream baseStream;
private long maxLength;
public LengthLimitedStream(Stream stream, long maxLength)
{
if (stream.Position > maxLength) { throw new IOException(); }
this.baseStream = stream;
this.maxLength = maxLength;
}
public override bool CanRead
{
get { return this.baseStream.CanRead; }
}
public override long Length
{
get { return Math.Min(this.maxLength, this.baseStream.Length); }
}
public override long Position
{
get
{
return this.baseStream.Position;
}
set
{
if (value > maxLength)
{
throw new IOException();
}
this.baseStream.Position = value;
}
}
public override int Read(byte[] buffer, int offset, int count)
{
if (this.Position + offset + count > this.maxLength)
{
count = (int)(this.maxLength - (this.Position + offset));
}
return this.baseStream.Read(buffer, offset, count);
}
// Lots of stuff omitted you may want to implement but not important in this case ...
}
(Добавьте валидацию параметров и тому подобное, но вы поймете идею)
Таким образом, вы все равно можете использовать метод ComputeHash(Stream)
, и он выглядит чистым и простым (вмое мнение) .