using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace CY_DocumentFileWCFService { /// /// 自定义读取流(只读) /// internal class CusStreamReader : Stream { long _endPosition;//结束位置 Stream innerStream; /// /// 参数为当前流的断点 /// public event Action Reading; /// /// 直接使用原始流。 /// /// 原始流 public CusStreamReader(Stream stream) { this.innerStream = stream; _endPosition = stream.Length; } /// /// 使用流当前位置,指定长度初始化自定义流 /// /// 原始流 /// 使用长度 public CusStreamReader(Stream stream, long count) { this.innerStream = stream; _endPosition = stream.Position + count; if (_endPosition > stream.Length) _endPosition = stream.Length; } /// /// 指定初始位置、长度初始化自定义流 /// /// 原始流 /// 初始位置 /// 使用长度 public CusStreamReader(Stream stream, long offset, long count) { stream.Position = offset > stream.Length ? stream.Length : offset; this.innerStream = stream; _endPosition = offset + count; if (_endPosition > stream.Length) _endPosition = stream.Length; } /// /// 从自定义流读取指定长度到array,但是不超过初始化时设定的长度。 /// /// 读取的字节数 public override int Read(byte[] array, int offset, int count) { int readcount = 0; if (Position + count > this._endPosition) readcount = innerStream.Read(array, offset, (int)(this._endPosition - Position)); else readcount = innerStream.Read(array, offset, count); if (Reading != null) Reading(Position); return readcount; } /// /// 从自定义流读取一个字节,但是不超过初始化时设定的长度。 /// /// 读取的字节,未找到则返回-1 public override int ReadByte() { if (Position >= this._endPosition) return -1; else return base.ReadByte(); } public override bool CanRead { get { return innerStream.CanRead; } } 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 { return _endPosition - innerStream.Position; } } /// /// 自定义流位置,返回原始流的位置 /// public override long Position { get { return innerStream.Position; } 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(); } } }