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