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.

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