Любой способ использовать Stream.CopyTo для копирования только определенного количества байтов?
Можно ли использовать Stream.CopyTo для копирования только определенного количества байтов в поток назначения? Какое лучшее обходное решение?
Edit:
Мое обходное решение (код опущен):
internal sealed class Substream : Stream
{
private readonly Stream stream;
private readonly long origin;
private readonly long length;
private long position;
public Substream(Stream stream, long length)
{
this.stream = stream;
this.origin = stream.Position;
this.position = stream.Position;
this.length = length;
}
public override int Read(byte[] buffer, int offset, int count)
{
var n = Math.Max(Math.Min(count, origin + length - position), 0);
int bytesRead = stream.Read(buffer, offset, (int) n);
position += bytesRead;
return bytesRead;
}
}
затем скопируйте n байтов:
var substream = new Substream(stream, n);
substream.CopyTo(stm);
Ответы
Ответ 1
Реализация копирующих потоков не слишком сложна. Если вы хотите адаптировать его для копирования только определенного количества байтов, тогда не должно быть слишком сложно настроить существующий метод, что-то вроде этого
public static void CopyStream(Stream input, Stream output, int bytes)
{
byte[] buffer = new byte[32768];
int read;
while (bytes > 0 &&
(read = input.Read(buffer, 0, Math.Min(buffer.Length, bytes))) > 0)
{
output.Write(buffer, 0, read);
bytes -= read;
}
}
Проверка на bytes > 0
, вероятно, не является строго необходимой, но не может нанести вреда.
Ответ 2
Что не так, просто скопировав нужные вам байты с помощью буфера?
long CopyBytes(long bytesRequired, Stream inStream, Stream outStream)
{
long readSoFar = 0L;
var buffer = new byte[64*1024];
do
{
var toRead = Math.Min(bytesRequired - readSoFar, buffer.Length);
var readNow = inStream.Read(buffer, 0, (int)toRead);
if (readNow == 0)
break; // End of stream
outStream.Write(buffer, 0, readNow);
readSoFar += readNow;
} while (readSoFar < bytesRequired);
return readSoFar;
}