Differences
This shows you the differences between the selected revisions of the page.
| library_session_filetransferprogress 2013-05-23 | library_session_filetransferprogress 2024-09-12 (current) | ||
| Line 1: | Line 1: | ||
| ====== Session.FileTransferProgress Event ====== | ====== Session.FileTransferProgress Event ====== | ||
| - | &beta_feature | ||
| - | Occurs during file tranfer to report transfer progress. Occurs as part of either ''[[library_session_getfiles|Session.GetFiles]]'', ''[[library_session_putfiles|Session.PutFiles]]'' or ''[[library_session_synchronizedirectories|Session.SynchronizeDirectories]]''. | + | Occurs during file transfer to report transfer progress. Occurs as part of either ''[[library_session_getfiles|Session.GetFiles]]'', ''[[library_session_putfiles|Session.PutFiles]]'' (and other derived download and upload methods) or ''[[library_session_synchronizedirectories|Session.SynchronizeDirectories]]''. |
| ===== Syntax ===== | ===== Syntax ===== | ||
| <code csharp *> | <code csharp *> | ||
| - | public delegate void FileTransferProgressEventHandler(object sender, FileTransferProgressEventArgs e); | + | public delegate void FileTransferProgressEventHandler( |
| + | ····object sender, | ||
| + | ···FileTransferProgressEventArgs e | ||
| + | ); | ||
| public event FileTransferredEventHandler FileTransferred; | public event FileTransferredEventHandler FileTransferred; | ||
| </code> | </code> | ||
| Line 12: | Line 14: | ||
| <code vbnet *> | <code vbnet *> | ||
| Public Delegate Sub FileTransferProgressEventHandler( | Public Delegate Sub FileTransferProgressEventHandler( | ||
| - | ByVal sender As Object, ByVal e As FileTransferProgressEventArgs) | + | sender As Object, |
| + | ···e As FileTransferProgressEventArgs | ||
| + | ) | ||
| Public Custom Event FileTransferred As FileTransferredEventHandler | Public Custom Event FileTransferred As FileTransferredEventHandler | ||
| </code> | </code> | ||
| Line 20: | Line 24: | ||
| The event is raised, when starting transfer of every file, and then at most once a second for duration of the transfer. | 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 ''[[library_session_open|Open]]''. | ||
| See also ''[[library_session_filetransferred|Session.FileTransferred]]''. | See also ''[[library_session_filetransferred|Session.FileTransferred]]''. | ||
| ===== [[example]] Examples ===== | ===== [[example]] Examples ===== | ||
| + | |||
| ==== [[csharp]] C# Example ==== | ==== [[csharp]] C# Example ==== | ||
| <code csharp> | <code csharp> | ||
| Line 36: | Line 43: | ||
| { | { | ||
| // Setup session options | // Setup session options | ||
| - | SessionOptions sessionOptions = new SessionOptions { | + | SessionOptions sessionOptions = new SessionOptions |
| + | ···········{ | ||
| Protocol = Protocol.Sftp, | Protocol = Protocol.Sftp, | ||
| HostName = "example.com", | HostName = "example.com", | ||
| UserName = "user", | UserName = "user", | ||
| Password = "mypassword", | Password = "mypassword", | ||
| - | SshHostKeyFingerprint = "ssh-rsa 1024 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx" | + | SshHostKeyFingerprint = "ssh-rsa 2048 xxxxxxxxxxx..." |
| }; | }; | ||
| Line 55: | Line 63: | ||
| { | { | ||
| // Download files and throw on any error | // Download files and throw on any error | ||
| - | session.GetFiles("/home/martin/public_html/", "d:\\backup\\").Check(); | + | session.GetFiles("/home/martin/public_html/*", @"d:\backup\").Check(); |
| } | } | ||
| finally | finally | ||
| Line 76: | Line 84: | ||
| } | } | ||
| - | private static void SessionFileTransferProgress(object sender, FileTransferProgressEventArgs e) | + | private static void SessionFileTransferProgress( |
| + | ········object sender, FileTransferProgressEventArgs e) | ||
| { | { | ||
| // New line for every new file | // New line for every new file | ||
| Line 97: | Line 106: | ||
| ==== [[vbnet]] VB.NET Example ==== | ==== [[vbnet]] VB.NET Example ==== | ||
| <code vbnet> | <code vbnet> | ||
| - | Imports System | ||
| Imports WinSCP | Imports WinSCP | ||
| Line 112: | Line 120: | ||
| .UserName = "user" | .UserName = "user" | ||
| .Password = "mypassword" | .Password = "mypassword" | ||
| - | .SshHostKeyFingerprint = "ssh-rsa 1024 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx" | + | .SshHostKeyFingerprint = "ssh-rsa 2048 xxxxxxxxxxx..." |
| End With | End With | ||
| - | Using session As Session = New Session | + | Using session As New Session |
| ' Will continuously report progress of transfer | ' Will continuously report progress of transfer | ||
| AddHandler session.FileTransferProgress, AddressOf SessionFileTransferProgress | AddHandler session.FileTransferProgress, AddressOf SessionFileTransferProgress | ||
| Line 125: | Line 133: | ||
| ' Download files and throw on any error | ' Download files and throw on any error | ||
| session.GetFiles( _ | session.GetFiles( _ | ||
| - | "/home/martin/public_html/", "d:\backup\").Check | + | "/home/martin/public_html/*", "d:\backup\").Check() |
| Finally | Finally | ||
| ' Terminate line after the last file (if any) | ' Terminate line after the last file (if any) | ||
| - | If Example._lastFileName IsNot Nothing Then | + | If _lastFileName IsNot Nothing Then |
| - | Console.WriteLine | + | Console.WriteLine() |
| End If | End If | ||
| End Try | End Try | ||
| Line 143: | Line 151: | ||
| Private Shared Sub SessionFileTransferProgress( | Private Shared Sub SessionFileTransferProgress( | ||
| - | ByVal sender As Object, ByVal e As FileTransferProgressEventArgs) | + | sender As Object, e As FileTransferProgressEventArgs) |
| ' New line for every new file | ' New line for every new file | ||
| - | If (_lastFileName IsNot Nothing) AndAlso (_lastFileName <> e.FileName)) Then | + | If (_lastFileName IsNot Nothing) AndAlso (_lastFileName <> e.FileName) Then |
| - | Console.WriteLine | + | Console.WriteLine() |
| End If | End If | ||
| Line 159: | Line 167: | ||
| End Class | End Class | ||
| </code> | </code> | ||
| + | |||
| + | ==== [[powershell]] PowerShell Example ==== | ||
| + | Learn more about [[library_powershell|using WinSCP .NET assembly from PowerShell]]. | ||
| + | |||
| + | <code 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 | ||
| + | } | ||
| + | </code> | ||
| + | |||
| + | If you want a pseudo-GUI progress bar, you can make use of ''[[ps>microsoft.powershell.utility/write-progress|Write-Progress]]'' cmdlet: | ||
| + | |||
| + | <code powershell> | ||
| + | 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) | ||
| + | } | ||
| + | </code> | ||
| + | |||
| + | ==== Real-Life Example ==== | ||
| + | |||
| + | * [[library_example_winforms_progressbar|*]]. | ||
| + | |||