4

I want to show the progress of an uploading process on my ProgressBar, Here is the code of my button "Upload":

private void button2_Click(object sender, EventArgs e)
{
    int Port = int.Parse(textBox2.Text);
    string Host = textBox1.Text;
    string Username = textBox3.Text;
    string Password = textBox4.Text;
    string WorkingDirectory = textBox6.Text;
    string UploadDirectory = textBox5.Text;

    FileInfo FI = new FileInfo(UploadDirectory);
    string UploadFile = FI.FullName;
    Console.WriteLine(FI.Name);
    Console.WriteLine("UploadFile" + UploadFile);

    var Client = new SftpClient(Host, Port, Username, Password);
    Client.Connect();
    if (Client.IsConnected)
    {
        var FS = new FileStream(UploadFile, FileMode.Open);
        if (FS != null)
        {
            Client.UploadFile(FS, WorkingDirectory + FI.Name, null);
            Client.Disconnect();
            Client.Dispose();
            MessageBox.Show(
                "Upload complete", "Information", MessageBoxButtons.OK,
                MessageBoxIcon.Information);
        }
    }
}

1 Answer 1

14

You have to provide a callback to the uploadCallback argument of SftpClient.UploadFile.

public void UploadFile(
    Stream input, string path, Action<ulong> uploadCallback = null)

And of course, you have to upload on a background thread or use an asynchronous upload (SftpClient.BeginUploadFile).


Example using a background thread (task):

private void button1_Click(object sender, EventArgs e)
{
    // Run Upload on background thread
    Task.Run(() => Upload());
}

private void Upload()
{
    try
    {
        int Port = 22;
        string Host = "example.com";
        string Username = "username";
        string Password = "password";
        string RemotePath = "/remote/path/";
        string SourcePath = @"C:\local\path\";
        string FileName = "upload.txt";

        using (var stream = new FileStream(SourcePath + FileName, FileMode.Open))
        using (var client = new SftpClient(Host, Port, Username, Password))
        {
            client.Connect();
            // Set progress bar maximum on foreground thread
            int max = (int)stream.Length;
            progressBar1.Invoke(
                (MethodInvoker)delegate { progressBar1.Maximum = max; });
            // Upload with progress callback
            client.UploadFile(stream, RemotePath + FileName, UpdateProgresBar);
            MessageBox.Show("Upload complete");
        }
    }
    catch (Exception e)
    {
        MessageBox.Show(e.Message);
    }
}

private void UpdateProgresBar(ulong uploaded)
{
    // Update progress bar on foreground thread
    progressBar1.Invoke(
        (MethodInvoker)delegate { progressBar1.Value = (int)uploaded; });
}

enter image description here


For download see:
Displaying progress of file download in a ProgressBar with SSH.NET

Sign up to request clarification or add additional context in comments.

1 Comment

Man, you are really awesome, it works well for me, a thousand thanks.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.