Если вы беспокоитесь о сохранении слишком много данных в памяти, вы можете создать поток обертку, которая дросселирует максимум количество прочитанных байтов.
Не выполняя всю работу, вот примерная плита котла, которую вы можете использовать для начала работы.
Редактировать: Просьба ознакомиться с комментариями для рекомендаций по улучшению этой реализации. End редактировать
public class LimitedStream : Stream
{
private int current = 0;
private int limit;
private Stream stream;
public LimitedStream(Stream stream, int n)
{
this.limit = n;
this.stream = stream;
}
public override int ReadByte()
{
if (current >= limit)
return -1;
var numread = base.ReadByte();
if (numread >= 0)
current++;
return numread;
}
public override int Read(byte[] buffer, int offset, int count)
{
count = Math.Min(count, limit - current);
var numread = this.stream.Read(buffer, offset, count);
current += numread;
return numread;
}
public override long Seek(long offset, SeekOrigin origin)
{
throw new NotImplementedException();
}
public override void SetLength(long value)
{
throw new NotImplementedException();
}
public override void Write(byte[] buffer, int offset, int count)
{
throw new NotImplementedException();
}
public override bool CanRead
{
get { return true; }
}
public override bool CanSeek
{
get { return false; }
}
public override bool CanWrite
{
get { return false; }
}
public override void Flush()
{
throw new NotImplementedException();
}
public override long Length
{
get { throw new NotImplementedException(); }
}
public override long Position
{
get { throw new NotImplementedException(); }
set { throw new NotImplementedException(); }
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (this.stream != null)
{
this.stream.Dispose();
}
}
}
Вот пример потока в использовании, оберточная файловый поток, но дросселирования количество прочитанных байтов до указанного предела:
using (var stream = new LimitedStream(File.OpenRead(@".\test.xml"), 100))
{
var bytes = new byte[1024];
stream.Read(bytes, 0, bytes.Length);
}
@freelookenstein: из чистого любопытство, почему вы хотите это сделать? Я не говорю, что ты не прав. Мне совершенно любопытно, что ты хочешь делать :)/Мне нравится учиться! –
Я реализую процедуру загрузки, которая может возобновить частичную загрузку. Хотя мне тоже очень любопытно :) – user37078