问题描述
让我们假设我想连续将三个文件流式传输给一个用户,但不是他递给我一个 Stream 对象来向下推字节,我必须递给他一个 Stream 对象,他将从中提取字节.我想使用我的三个 FileStream 对象(或者更聪明的 IEnumerable
Let's imagine I want to stream three files to a user all in a row, but instead of him handing me a Stream object to push bytes down, I have to hand him a Stream object he'll pull bytes from. I'd like to take my three FileStream objects (or even cleverer, an IEnumerable<Stream>) and return a new ConcatenatedStream object that would pull from the source streams on demand.
推荐答案
class ConcatenatedStream : Stream { Queue<Stream> streams; public ConcatenatedStream(IEnumerable<Stream> streams) { this.streams = new Queue<Stream>(streams); } public override bool CanRead { get { return true; } } public override int Read(byte[] buffer, int offset, int count) { int totalBytesRead = 0; while (count > 0 && streams.Count > 0) { int bytesRead = streams.Peek().Read(buffer, offset, count); if (bytesRead == 0) { streams.Dequeue().Dispose(); continue; } totalBytesRead += bytesRead; offset += bytesRead; count -= bytesRead; } return totalBytesRead; } 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(); } } 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(); } }