StreamWrap.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using System;
  2. using System.IO;
  3. namespace RamDavisk.Ramfs.Inters
  4. {
  5. public class StreamWrap : Stream
  6. {
  7. private long _pos;
  8. private MemoryStream _underlyingStream;
  9. public StreamWrap(MemoryStream stream)
  10. {
  11. _underlyingStream = stream;
  12. }
  13. public override void Flush() => _underlyingStream.Flush();
  14. public override long Seek(long offset, SeekOrigin origin)
  15. {
  16. switch (origin)
  17. {
  18. case SeekOrigin.Begin:
  19. _pos = offset;
  20. break;
  21. case SeekOrigin.Current:
  22. _pos += offset;
  23. break;
  24. case SeekOrigin.End:
  25. _pos = Length + offset;
  26. break;
  27. default:
  28. throw new ArgumentOutOfRangeException(nameof(origin), origin, null);
  29. }
  30. return _pos;
  31. }
  32. public override void SetLength(long value)
  33. {
  34. lock (_underlyingStream)
  35. _underlyingStream.SetLength(value);
  36. }
  37. public override int Read(byte[] buffer, int offset, int count)
  38. {
  39. lock (_underlyingStream)
  40. {
  41. try
  42. {
  43. _underlyingStream.Position = _pos;
  44. return _underlyingStream.Read(buffer, offset, count);
  45. }
  46. finally
  47. {
  48. _pos = _underlyingStream.Position;
  49. }
  50. }
  51. }
  52. public override void Write(byte[] buffer, int offset, int count)
  53. {
  54. lock (_underlyingStream)
  55. {
  56. _underlyingStream.Position = _pos;
  57. _underlyingStream.Write(buffer, offset, count);
  58. _pos = _underlyingStream.Position;
  59. }
  60. }
  61. public override bool CanRead => _underlyingStream.CanRead;
  62. public override bool CanSeek => _underlyingStream.CanSeek;
  63. public override bool CanWrite => _underlyingStream.CanWrite;
  64. public override long Length => _underlyingStream.Length;
  65. public override long Position { get => _pos; set => _pos = value; }
  66. public override void Close()
  67. {
  68. base.Close();
  69. _underlyingStream = null;
  70. }
  71. }
  72. }