SFTP progress with SSH.NET

VB2010 with SSH.NET https://sshnet.codeplex.com/ I downloaded and implemented the SFTP download library, and it works great. I looked at the documentation and examples and just don't see how to implement SFTP loading with progress. I want to display the progress of the download as it appears. So far, I:

Imports Renci.SshNet Imports System.IO Using sftp As New SftpClient("0.0.0.0", 25, "id", "pwd") 'connect to the server sftp.Connect() 'the name of the remote file we want to transfer to the PC Dim remoteFileName As String = "/data/OUT/trips.txt" 'download the file as a memory stream and convert to a file stream Using ms As New MemoryStream 'download as memory stream sftp.DownloadFile(remoteFileName, ms) 'create a file stream Dim fs As New FileStream("c:\mytrips.txt", FileMode.Create, FileAccess.Write) 'write the memory stream to the file stream ms.WriteTo(fs) 'close file stream fs.Close() 'close memory stream ms.Close() End Using 'disconnect from the server sftp.Disconnect() MsgBox("The file has been downloaded from the server.", MsgBoxStyle.Information) End Using 

Edit: ok I did some research and found an example in the Codeplex discussion forum. From this, I learned that there is another download function that is asynchronous, which I will use. Its a good approach to displaying progress in the debug window, as well as monitoring progress. Feel free to comment.

 Imports Renci.SshNet Imports System.IO Imports Renci.SshNet.Sftp Dim fileSize As Long Private Sub btnGo_Click(sender As Object, e As EventArgs) Handles btnGo.Click Try Using sftp As New SftpClient("0.0.0.0", 25, "id", "pwd") 'connect to the server sftp.Connect() 'the name of the remote file we want to transfer to the PC Dim remoteFileName As String = "/Data/OUT/Config.txt" 'check for existence of the file Dim IsExists As Boolean = sftp.Exists(remoteFileName) If IsExists Then 'get the attributes of the file (namely the size) Dim att As Sftp.SftpFileAttributes = sftp.GetAttributes(remoteFileName) fileSize = att.Size 'download the file as a memory stream and convert to a file stream Using ms As New MemoryStream 'download as memory stream 'sftp.DownloadFile(remoteFileName, ms, AddressOf DownloadCallback) 'with download progress 'sftp.DownloadFile(remoteFileName, ms) 'without download progress 'here we try an asynchronous operation and wait for it to complete. Dim asyncr As IAsyncResult = sftp.BeginDownloadFile(remoteFileName, ms) Dim sftpAsyncr As SftpDownloadAsyncResult = CType(asyncr, SftpDownloadAsyncResult) While Not sftpAsyncr.IsCompleted Dim pct As Integer = CInt((sftpAsyncr.DownloadedBytes / fileSize) * 100) Debug.Print("Downloaded {0} of {1} ({2}%).", sftpAsyncr.DownloadedBytes, fileSize, pct) pgbMain.Value = pct Application.DoEvents() End While sftp.EndDownloadFile(asyncr) 'create a file stream Dim localFileName As String = "c:\" & Date.Now.ToString("yyyy-dd-MM_HHmmss") & "_test.txt" Dim fs As New FileStream(localFileName, FileMode.Create, FileAccess.Write) 'write the memory stream to the file stream ms.WriteTo(fs) 'close file stream fs.Close() 'close memory stream ms.Close() End Using 'disconnect from the server sftp.Disconnect() 'success MsgBox("The file has been downloaded from the server.", MsgBoxStyle.Information) Else MsgBox("The file does not exist on the server.", MsgBoxStyle.Exclamation) End If End Using Catch ex As Exception MsgBox(ex.ToString, MsgBoxStyle.Critical) Finally Me.Cursor = Cursors.Default End Try End Sub 

My test file took 0.4 seconds to load, so it was hard to see the progress. Testing large files is very good.

+6
source share
1 answer

I did some research and found an example in the Codeplex discussion forum. From this, I learned that there is another download function that is asynchronous, which I will use. Its a good approach to displaying progress in the debug window, as well as monitoring progress. Feel free to comment

  Imports Renci.SshNet Imports System.IO Imports Renci.SshNet.Sftp Dim fileSize As Long Private Sub btnGo_Click(sender As Object, e As EventArgs) Handles btnGo.Click Try Using sftp As New SftpClient("0.0.0.0", 25, "id", "pwd") 'connect to the server sftp.Connect() 'the name of the remote file we want to transfer to the PC Dim remoteFileName As String = "/Data/OUT/Config.txt" 'check for existence of the file Dim IsExists As Boolean = sftp.Exists(remoteFileName) If IsExists Then 'get the attributes of the file (namely the size) Dim att As Sftp.SftpFileAttributes = sftp.GetAttributes(remoteFileName) fileSize = att.Size 'download the file as a memory stream and convert to a file stream Using ms As New MemoryStream 'download as memory stream 'sftp.DownloadFile(remoteFileName, ms, AddressOf DownloadCallback) 'with download progress 'sftp.DownloadFile(remoteFileName, ms) 'without download progress 'here we try an asynchronous operation and wait for it to complete. Dim asyncr As IAsyncResult = sftp.BeginDownloadFile(remoteFileName, ms) Dim sftpAsyncr As SftpDownloadAsyncResult = CType(asyncr, SftpDownloadAsyncResult) While Not sftpAsyncr.IsCompleted Dim pct As Integer = CInt((sftpAsyncr.DownloadedBytes / fileSize) * 100) Debug.Print("Downloaded {0} of {1} ({2}%).", sftpAsyncr.DownloadedBytes, fileSize, pct) pgbMain.Value = pct Application.DoEvents() End While sftp.EndDownloadFile(asyncr) 'create a file stream Dim localFileName As String = "c:\" & Date.Now.ToString("yyyy-dd-MM_HHmmss") & "_test.txt" Dim fs As New FileStream(localFileName, FileMode.Create, FileAccess.Write) 'write the memory stream to the file stream ms.WriteTo(fs) 'close file stream fs.Close() 'close memory stream ms.Close() End Using 'disconnect from the server sftp.Disconnect() 'success MsgBox("The file has been downloaded from the server.", MsgBoxStyle.Information) Else MsgBox("The file does not exist on the server.", MsgBoxStyle.Exclamation) End If End Using Catch ex As Exception MsgBox(ex.ToString, MsgBoxStyle.Critical) Finally Me.Cursor = Cursors.Default End Try End Sub 
+1
source

All Articles