DocSpace-client/common/ASC.Data.Storage/ProgressStream.cs

65 lines
1.6 KiB
C#
Raw Normal View History

2022-02-10 11:24:16 +00:00
namespace ASC.Data.Storage;
public class ProgressStream : Stream
2019-06-04 14:43:20 +00:00
{
2022-02-10 11:24:16 +00:00
public override bool CanRead => _stream.CanRead;
public override bool CanSeek => _stream.CanSeek;
public override bool CanWrite => _stream.CanWrite;
public override long Length => _length;
public override long Position
2019-06-04 14:43:20 +00:00
{
2022-02-10 11:24:16 +00:00
get => _stream.Position;
set => _stream.Position = value;
}
2022-02-10 11:24:16 +00:00
private readonly Stream _stream;
private long _length = long.MaxValue;
2019-06-04 14:43:20 +00:00
2022-02-10 11:24:16 +00:00
public ProgressStream(Stream stream)
{
_stream = stream ?? throw new ArgumentNullException(nameof(stream));
2022-02-10 11:24:16 +00:00
try
{
_length = stream.Length;
2019-06-04 14:43:20 +00:00
}
2022-02-10 11:24:16 +00:00
catch (Exception) { }
}
2019-06-04 14:43:20 +00:00
2022-02-10 11:24:16 +00:00
public event Action<ProgressStream, int> OnReadProgress;
2019-06-04 14:43:20 +00:00
2022-02-10 11:24:16 +00:00
public void InvokeOnReadProgress(int progress)
{
OnReadProgress?.Invoke(this, progress);
}
2019-06-04 14:43:20 +00:00
2022-02-10 11:24:16 +00:00
public override void Flush()
{
_stream.Flush();
}
2019-06-04 14:43:20 +00:00
2022-02-10 11:24:16 +00:00
public override long Seek(long offset, SeekOrigin origin)
{
return _stream.Seek(offset, origin);
}
2019-06-04 14:43:20 +00:00
2022-02-10 11:24:16 +00:00
public override void SetLength(long value)
{
_stream.SetLength(value);
_length = value;
}
2019-06-04 14:43:20 +00:00
2022-02-10 11:24:16 +00:00
public override int Read(byte[] buffer, int offset, int count)
{
var readed = _stream.Read(buffer, offset, count);
OnReadProgress(this, (int)(_stream.Position / (double)_length * 100));
2022-02-10 11:06:37 +00:00
2022-02-10 11:24:16 +00:00
return readed;
}
2019-06-04 14:43:20 +00:00
2022-02-10 11:24:16 +00:00
public override void Write(byte[] buffer, int offset, int count)
{
_stream.Write(buffer, offset, count);
2019-06-04 14:43:20 +00:00
}
2022-02-10 11:24:16 +00:00
}