Session.FileTransferProgress Event

Occurs during file transfer to report transfer progress. Occurs as part of either Session.GetFiles, Session.PutFiles (and other derived download and upload methods) or Session.SynchronizeDirectories.

Advertisement

Syntax

C#
public delegate void FileTransferProgressEventHandler(
    object sender,
    FileTransferProgressEventArgs e
);
public event FileTransferredEventHandler FileTransferred;
VB.NET
Public Delegate Sub FileTransferProgressEventHandler(
    sender As Object,
    e As FileTransferProgressEventArgs
)
Public Custom Event FileTransferred As FileTransferredEventHandler

Remarks

See FileTransferProgressEventArgs.

The event is raised, when starting transfer of every file, and then at most once a second for duration of the transfer.

The event has to be subscribed before calling Open.

See also Session.FileTransferred.

Examples

C# Example

using System;
using WinSCP;
 
class Example
{
    public static int Main()
    {
        try
        {
            // Setup session options
            SessionOptions sessionOptions = new SessionOptions
            {
                Protocol = Protocol.Sftp,
                HostName = "example.com",
                UserName = "user",
                Password = "mypassword",
                SshHostKeyFingerprint = "ssh-rsa 2048 xxxxxxxxxxx..."
            };
 
            using (Session session = new Session())
            {
                // Will continuously report progress of transfer
                session.FileTransferProgress += SessionFileTransferProgress;
 
                // Connect
                session.Open(sessionOptions);
 
                try
                {
                    // Download files and throw on any error
                    session.GetFiles("/home/martin/public_html/*", @"d:\backup\").Check();
                }
                finally
                {
                    // Terminate line after the last file (if any)
                    if (_lastFileName != null)
                    {
                        Console.WriteLine();
                    }
                }
            }
 
            return 0;
        }
        catch (Exception e)
        {
            Console.WriteLine("Error: {0}", e);
            return 1;
        }
    }
 
    private static void SessionFileTransferProgress(
        object sender, FileTransferProgressEventArgs e)
    {
        // New line for every new file
        if ((_lastFileName != null) && (_lastFileName != e.FileName))
        {
            Console.WriteLine();
        }
 
        // Print transfer progress
        Console.Write("\r{0} ({1:P0})", e.FileName, e.FileProgress);
 
        // Remember a name of the last file reported
        _lastFileName = e.FileName;
    }
 
    private static string _lastFileName;
}

Advertisement

VB.NET Example

Imports WinSCP
 
Friend Class Example
 
    Public Shared Function Main() As Integer
 
        Try 
            ' Setup session options
            Dim sessionOptions As New SessionOptions
            With sessionOptions
                .Protocol = Protocol.Sftp
                .HostName = "example.com"
                .UserName = "user"
                .Password = "mypassword"
                .SshHostKeyFingerprint = "ssh-rsa 2048 xxxxxxxxxxx..."
            End With
 
            Using session As New Session
                ' Will continuously report progress of transfer
                AddHandler session.FileTransferProgress, AddressOf SessionFileTransferProgress
 
                ' Connect
                session.Open(sessionOptions)
 
                Try 
                    ' Download files and throw on any error
                    session.GetFiles( _
                        "/home/martin/public_html/*", "d:\backup\").Check()
                Finally
                    ' Terminate line after the last file (if any)
                    If _lastFileName IsNot Nothing Then
                        Console.WriteLine()
                    End If
                End Try
            End Using
 
            Return 0
        Catch e As Exception
            Console.WriteLine("Error: {0}", e)
            Return 1
        End Try
 
    End Function
 
    Private Shared Sub SessionFileTransferProgress(
            sender As Object, e As FileTransferProgressEventArgs)
        ' New line for every new file
        If (_lastFileName IsNot Nothing) AndAlso (_lastFileName <> e.FileName) Then
            Console.WriteLine()
        End If
 
        ' Print transfer progress
        Console.Write("\r{0} ({1:P0})", e.FileName, e.FileProgress)
 
        ' Remember a name of the last file reported
        _lastFileName = e.FileName
    End Sub
 
    Private Shared _lastFileName As String
End Class

Advertisement

PowerShell Example

Learn more about using WinSCP .NET assembly from PowerShell.

# Load WinSCP .NET assembly
Add-Type -Path "WinSCPnet.dll"
 
# Session.FileTransferProgress event handler
 
function FileTransferProgress
{
    param($e)
 
    # New line for every new file
    if (($script:lastFileName -ne $Null) -and
        ($script:lastFileName -ne $e.FileName))
    {
        Write-Host
    }
 
    # Print transfer progress
    Write-Host -NoNewline ("`r{0} ({1:P0})" -f $e.FileName, $e.FileProgress)
 
    # Remember a name of the last file reported
    $script:lastFileName = $e.FileName
}
 
# Main script
 
$script:lastFileName = $Null
 
try
{
    $sessionOptions = New-Object WinSCP.SessionOptions -Property @{
        Protocol = [WinSCP.Protocol]::Sftp
        HostName = "example.com"
        UserName = "user"
        Password = "mypassword"
        SshHostKeyFingerprint = "ssh-rsa 2048 xxxxxxxxxxx..."
    }
 
    $session = New-Object WinSCP.Session
    try
    {
        # Will continuously report progress of transfer
        $session.add_FileTransferProgress( { FileTransferProgress($_) } )
 
        # Connect
        $session.Open($sessionOptions)
 
        # Download the file and throw on any error
        $session.GetFiles("/home/martin/public_html/*", "d:\backup\").Check()
    }
    finally
    {
        # Terminate line after the last file (if any)
        if ($script:lastFileName -ne $Null)
        {
            Write-Host
        }
 
        # Disconnect, clean up
        $session.Dispose()
    }
 
    exit 0
}
catch
{
    Write-Host "Error: $($_.Exception.Message)"
    exit 1
}

Advertisement

If you want a pseudo-GUI progress bar, you can make use of Write-Progress cmdlet:

function FileTransferProgress
{
    param($e)
 
    Write-Progress `
        -Activity "Uploading" -Status ("{0:P0} complete:" -f $e.OverallProgress) `
        -PercentComplete ($e.OverallProgress * 100)
    Write-Progress `
        -Id 1 -Activity $e.FileName -Status ("{0:P0} complete:" -f $e.FileProgress) `
        -PercentComplete ($e.FileProgress * 100)
}

Real-Life Example

Last modified: by martin