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

  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Text;
  5. namespace Apewer.Models
  6. {
  7. /// <summary>虚拟流,不写入任何数据,读取数据时候全部置为 0x00。</summary>
  8. internal class VoidStream : Stream
  9. {
  10. private long length = 0L;
  11. private long position = 0L;
  12. /// <summary>此属性始终返回 True。</summary>
  13. public override bool CanRead { get { return true; } }
  14. /// <summary>此属性始终返回 True。</summary>
  15. public override bool CanSeek { get { return true; } }
  16. /// <summary>此属性始终返回 True。</summary>
  17. public override bool CanWrite { get { return true; } }
  18. /// <summary>可设置为任意值,默认为 0。</summary>
  19. public override long Length { get { return length; } }
  20. /// <summary>可设置为任意值,默认为 0。</summary>
  21. public override long Position
  22. {
  23. get { return position; }
  24. set
  25. {
  26. if (value < 0) position = 0L;
  27. else if (value > length) position = length;
  28. else position = value;
  29. }
  30. }
  31. /// <summary>不执行任何动作。</summary>
  32. public override void Flush() { }
  33. /// <summary>读取流(不向参数 buffer 写入数据)。</summary>
  34. public override int Read(byte[] buffer, int offset, int count)
  35. {
  36. if (buffer == null) return 0;
  37. if (buffer.LongLength < 1L) return 0;
  38. if (offset < 0) return 0;
  39. if (count < 1) return 0;
  40. var c = offset + count > buffer.Length ? buffer.Length - offset : count;
  41. position += c;
  42. return c;
  43. }
  44. /// <summary></summary>
  45. public override long Seek(long offset, SeekOrigin origin)
  46. {
  47. switch (origin)
  48. {
  49. case SeekOrigin.Begin:
  50. Position = offset;
  51. break;
  52. case SeekOrigin.Current:
  53. Position = position += offset;
  54. break;
  55. case SeekOrigin.End:
  56. Position = length + offset;
  57. break;
  58. }
  59. return position;
  60. }
  61. /// <summary>指定流的长度,最小值为 0。</summary>
  62. public override void SetLength(long value)
  63. {
  64. length = value > 0L ? value : 0L;
  65. }
  66. /// <summary>写入流,实际不写入任何数据。</summary>
  67. public override void Write(byte[] buffer, int offset, int count)
  68. {
  69. if (buffer == null) return;
  70. if (count < 1) return;
  71. if (buffer.LongLength < 1L) return;
  72. var s = offset;
  73. var e = offset + count;
  74. if (length < e) length = e;
  75. position = e;
  76. }
  77. }
  78. }