c# - 如何将两个 System.IO.Stream 实例连接成一个?

标签 c# .net stream

假设我想连续向用户传输三个文件,而不是他递给我 Stream反对下推字节,我必须递给他一个Stream他将从中提取字节的对象。我想带上我的三个FileStream对象(或者更聪明,一个 IEnumerable<Stream> )并返回一个新的 ConcatenatedStream将按需从源流中提取的对象。

最佳答案

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();
    }
}

关于c# - 如何将两个 System.IO.Stream 实例连接成一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3879152/

相关文章:

c# - EnumerateFiles() 如何工作?

c# - 使用 firebird 和 c# 创建身份字段时创建生成器错误错误

.NET:如何将 Azure RetriableStreamImpl 转换为 ASP.Net Core IFormFile?

无需使用 byte[] 即可立即从流中提取 Java zip 文件

c# - 全局常量可能吗?

c# - 带绑定(bind)的扩展 WPF 工具包数据网格

C# 我可以使用部分类来使代码更具可读性吗

.net - MEF 最佳实践是什么?

javascript - Node js .10 fs.createReadStream streams2 结束事件未触发

c# - 将 HttpPostedFileBase 转换到流