5

I want report progress of encrypting file this is my code how can I do this?

using (FileStream destination = new FileStream(destinationFilename, FileMode.CreateNew, FileAccess.Write, FileShare.None))
using (CryptoStream cryptoStream = new CryptoStream(destination, transform, CryptoStreamMode.Write))
using (FileStream source = new FileStream(sourceFilename, FileMode.Open, FileAccess.Read, FileShare.Read))
{
    await source.CopyToAsync(cryptoStream);
}
Uwe Keim
  • 39,551
  • 56
  • 175
  • 291
hadi khodabandeh
  • 585
  • 2
  • 7
  • 20
  • https://stackoverflow.com/questions/6044629/file-copy-with-progress-bar Have a look at this. – Alex Pshul Aug 09 '19 at 14:36
  • Try to poll [Position](https://learn.microsoft.com/en-us/dotnet/api/system.io.filestream.position), through I doubt it will work (likely position is not updated until complete operation is finished). Maybe you can put some custom stream in between to intercept calls to `WriteToAsync` (see `CopyToAsync` [sources](https://referencesource.microsoft.com/#mscorlib/system/io/stream.cs,129), it will split write operation into pieces by buffer size) and rise custom event to report progress. – Sinatr Aug 09 '19 at 14:45

1 Answers1

9

To do this properly you need to insert another stream to report progress. So something like this...

        using (FileStream destination = new FileStream(destinationFilename, FileMode.CreateNew, FileAccess.Write, FileShare.None))
        using (CryptoStream cryptoStream = new CryptoStream(destination, transform, CryptoStreamMode.Write))
        using (FileStream source = new FileStream(sourceFilename, FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            using (ProgressStream progressStream = new ProgressStream(source))
            {
                progressStream.UpdateProgress += ProgressStream_UpdateProgress;
                progressStream.CopyTo(cryptoStream);
            }
        }

Where ProgressStream is...

public class ProgressStream : Stream
{
    private Stream m_input = null;
    private long m_length = 0L;
    private long m_position = 0L;
    public event EventHandler<ProgressEventArgs> UpdateProgress;

    public ProgressStream(Stream input)
    {
        m_input = input;
        m_length = input.Length;
    }
    public override void Flush()
    {
        throw new System.NotImplementedException();
    }

    public override long Seek(long offset, SeekOrigin origin)
    {
        throw new System.NotImplementedException();
    }

    public override void SetLength(long value)
    {
        throw new System.NotImplementedException();
    }

    public override int Read(byte[] buffer, int offset, int count)
    {
        int n = m_input.Read(buffer, offset, count);
        m_position += n;
        UpdateProgress?.Invoke(this, new ProgressEventArgs((1.0f * m_position)/m_length));
        return n;
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
        throw new System.NotImplementedException();
    }

    public override bool CanRead => true;
    public override bool CanSeek => false;
    public override bool CanWrite => false;
    public override long Length => m_length;
    public override long Position
    {
        get {  return m_position; }
        set {  throw new System.NotImplementedException();}
    }
}

And ProgressEventArgs is

public class ProgressEventArgs : EventArgs
{
    private float m_progress;

    public ProgressEventArgs(float progress)
    {
        m_progress = progress;
    }

    public float Progress => m_progress;

}

And the event handler might be this...

    private void ProgressStream_UpdateProgress(object sender, ProgressEventArgs e)
    {
        Console.WriteLine($"Progress is {e.Progress * 100.0f}%");
    }

And when run against a sample file produces...

Progress is 5.272501%
Progress is 10.545%
Progress is 15.8175%
Progress is 21.09%
Progress is 26.3625%
Progress is 31.635%
Progress is 36.9075%
Progress is 42.18%
Progress is 47.4525%
Progress is 52.72501%
Progress is 57.99751%
Progress is 63.27001%
Progress is 68.5425%
Progress is 73.815%
Progress is 79.08751%
Progress is 84.36001%
Progress is 89.63251%
Progress is 94.90501%
Progress is 100%
Progress is 100%

Lots of room for enhancement and optimization, but this is the only effective way to do what you want to do.

AQuirky
  • 4,691
  • 2
  • 32
  • 51