This is an old revision of the document!

Session.FileTransferProgress Event

Occurs during file tranfer 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