2013-03-03 3 views
0

Я пытался сделать это самостоятельно, но столкнулся с ситуацией, когда мне нужна помощь. Я хотел бы использовать элемент управления progressbar, чтобы показать текущий ход загрузки файла FTP.Как использовать индикатор выполнения с классом FtpWebRequest?

В настоящее время я вручную изменяю значение элемента управления progressbar - но я не мог не подумать, что есть, вероятно, лучший или более простой подход. Он работает прямо сейчас, но индикатор прогресса спорадичен в показе прогресса на основе выполняемой части кода. Кроме того, я попытался перебросить весь фрагмент в отдельный поток, но заметил, что когда я делал это, индикатор прогресса не отображается до конца кода - затем он кратковременно мигает и снова скрывается.

Вот что я сделал до сих пор, любая помощь будет оценен:

Public Sub uploadAuthorization() 

    ProgressBar1.Show() 
    Dim fileName As String = Path.GetFileName(TextBoxFilePath.Text) 
    Dim ftpFolder As String = "authorizations" 

    Try 
     'Create FTP Request 
     Me.Cursor = Cursors.WaitCursor 
     Dim myRequest As FtpWebRequest = DirectCast(WebRequest.Create(ftpServer + "/" + ftpFolder + "/" + fileName), FtpWebRequest) 
     ProgressBar1.Value = 20 

     'Update properties 
     myRequest.Credentials = New NetworkCredential(ftpUsername, ftpPassword) 
     myRequest.Method = WebRequestMethods.Ftp.UploadFile 
     ProgressBar1.Value = ProgressBar1.Value + 20 

     'Read the file 
     Dim myFile As Byte() = File.ReadAllBytes(TextBoxFilePath.Text) 
     ProgressBar1.Value = ProgressBar1.Value + 20 

     'Upload the file 
     Dim myStream As Stream = myRequest.GetRequestStream() 
     myStream.Write(myFile, 0, myFile.Length) 
     ProgressBar1.Value = ProgressBar1.Value + 20 

     'Cleanup 
     myStream.Close() 
     myStream.Dispose() 
     ProgressBar1.Value = ProgressBar1.Value + 20 

    Catch ex As Exception 
     MsgBox(ex.Message, MsgBoxStyle.Information) 
    End Try 
    Me.Cursor = Cursors.Arrow 
End Sub 
+0

Вы могли бы использовать вместо WebClient.UpLoadFileAsync, например, http://www.vbforums.com/showthread.php?649866-WebClient.UploadFileAsync. Вы можете добавить учетные данные: http://msdn.microsoft.com/en-us/library/system.net.webclient.credentials.aspx. –

+0

Спасибо за предложение, я прочитаю его и дам вам знать, удастся ли мне его реализовать или нет. –

ответ

0

Здравствуйте еще раз,

Так, основываясь на предложенном чтении Эндрю Мортон, вот что я придумал как решение, и оно работает как шарм. Единственная проблема заключается в том, что класс WebClient не поддерживает метод UploadFileWithUniqueName, предлагаемый классом FtpWebRequest. Мне это очень понравилось - поскольку это дало мне возможность использовать случайные имена файлов, но я думаю, что это хороший компромисс, чтобы заставить индикатор выполнения работать.

Так вот решение:


Private WithEvents myFtpUploadWebClient As New WebClient 

Private Sub ButtonChooseFile_Click(sender As System.Object, e As System.EventArgs) Handles ButtonChooseFile.Click 

    If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then 
     OpenFileDialog1.Title = "Please choose the Authorization File" 
     TextBoxFilePath.Text = OpenFileDialog1.FileName 
     ProgressBar1.Show() 
     Me.Cursor = Cursors.WaitCursor 

     Dim myUri As New Uri(ftpServer & OpenFileDialog1.SafeFileName) 
     myFtpUploadWebClient.Credentials = New System.Net.NetworkCredential(ftpUsername, ftpPassword) 
     myFtpUploadWebClient.UploadFileAsync(myUri, OpenFileDialog1.FileName) 
    End If 

End Sub 

Private Sub myFtpUploadWebClient_UploadFileCompleted(sender As Object, e As System.Net.UploadFileCompletedEventArgs) Handles myFtpUploadWebClient.UploadFileCompleted 

    If e.Error IsNot Nothing Then 
     MessageBox.Show(e.Error.Message) 
    Else 
     Me.Cursor = Cursors.Default 
     MessageBox.Show("Authorization Form Uploaded Successfully!") 
    End If 
End Sub 

Private Sub myFtpUploadWebClient_UploadProgressChanged(sender As Object, e As System.Net.UploadProgressChangedEventArgs) Handles myFtpUploadWebClient.UploadProgressChanged 
    ProgressBar1.Value = e.ProgressPercentage 
End Sub 
Смежные вопросы