This is an old revision of the document!
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) }