2015-08-04 2 views
6

VB2010 с SSH.NET https://sshnet.codeplex.com/ Я загрузил и внедрил библиотеку для загрузки SFTP и отлично работает. Я смотрел документацию и примеры и просто не вижу, как реализовать загрузку SFTP с прогрессом. Я хочу отобразить ход загрузки по мере его появления. До сих пор у меня есть:SFTP Прогресс с SSH.NET

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 

Редактировать: ok Я провел некоторое исследование и нашел пример в дискуссионном форуме Codeplex. Из этого я узнал, что есть еще одна функция загрузки, которая является асинхронной, которую я буду использовать. Его хороший подход к отображению прогресса в окне отладки, а также контроль прогресса. Не стесняйтесь комментировать.

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 

Мой тестовый файл занял 0,4 секунды, чтобы загрузить его, поэтому было трудно увидеть прогресс. Тестирование больших файлов очень хорошо.

+0

Вы ищете индикатор выполнения или выполняете SFTP с клиентом Progress? –

+0

Я хотел бы получить отчет о ходе работы, чтобы обновить индикатор выполнения или метку со статусом. – sinDizzy

+0

Это странно, потому что сайт codeplex говорит: «Предоставьте отчет о состоянии для загрузки и загрузки sftp-операций, чтобы обеспечить точную реализацию индикатора выполнения», но не могут найти, как это реализовано. – sinDizzy

ответ

1

Я провел некоторое исследование и нашел пример в дискуссионном форуме Codeplex. Из этого я узнал, что есть еще одна функция загрузки, которая является асинхронной, которую я буду использовать. Его хороший подход к отображению прогресса в окне отладки, а также контроль прогресса. Не стесняйтесь прокомментировать

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 
Смежные вопросы