You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

94 lines
2.9 KiB

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace Apewer.Models
{
/// <summary>虚拟流,不写入任何数据,读取数据时候全部置为 0x00。</summary>
internal class VoidStream : Stream
{
private long length = 0L;
private long position = 0L;
/// <summary>此属性始终返回 True。</summary>
public override bool CanRead { get { return true; } }
/// <summary>此属性始终返回 True。</summary>
public override bool CanSeek { get { return true; } }
/// <summary>此属性始终返回 True。</summary>
public override bool CanWrite { get { return true; } }
/// <summary>可设置为任意值,默认为 0。</summary>
public override long Length { get { return length; } }
/// <summary>可设置为任意值,默认为 0。</summary>
public override long Position
{
get { return position; }
set
{
if (value < 0) position = 0L;
else if (value > length) position = length;
else position = value;
}
}
/// <summary>不执行任何动作。</summary>
public override void Flush() { }
/// <summary>读取流(不向参数 buffer 写入数据)。</summary>
public override int Read(byte[] buffer, int offset, int count)
{
if (buffer == null) return 0;
if (buffer.LongLength < 1L) return 0;
if (offset < 0) return 0;
if (count < 1) return 0;
var c = offset + count > buffer.Length ? buffer.Length - offset : count;
position += c;
return c;
}
/// <summary></summary>
public override long Seek(long offset, SeekOrigin origin)
{
switch (origin)
{
case SeekOrigin.Begin:
Position = offset;
break;
case SeekOrigin.Current:
Position = position += offset;
break;
case SeekOrigin.End:
Position = length + offset;
break;
}
return position;
}
/// <summary>指定流的长度,最小值为 0。</summary>
public override void SetLength(long value)
{
length = value > 0L ? value : 0L;
}
/// <summary>写入流,实际不写入任何数据。</summary>
public override void Write(byte[] buffer, int offset, int count)
{
if (buffer == null) return;
if (count < 1) return;
if (buffer.LongLength < 1L) return;
var s = offset;
var e = offset + count;
if (length < e) length = e;
position = e;
}
}
}