Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to report progress from FileStream

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);
}
like image 236
hadi khodabandeh Avatar asked Aug 09 '19 14:08

hadi khodabandeh


People also ask

How do I view a FileStream file?

using FileStream fs = File. OpenRead(fileName); With File. OpenRead we open a file for reading.

What is the use of FileStream?

Use the FileStream class to read from, write to, open, and close files on a file system, and to manipulate other file-related operating system handles, including pipes, standard input, and standard output.

How does FileStream work C#?

The FileStream is a class used for reading and writing files in C#. It is part of the System.IO namespace. To manipulate files using FileStream, you need to create an object of FileStream class. This object has four parameters; the Name of the File, FileMode, FileAccess, and FileShare.


1 Answers

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.

like image 173
AQuirky Avatar answered Sep 23 '22 09:09

AQuirky