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
public delegate void FileTransferProgressEventHandler( object sender, FileTransferProgressEventArgs e ); public event FileTransferredEventHandler FileTransferred;
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) }