2017-02-03 5 views
0

У меня есть несколько файлов для загрузки (на FTP-сервер), используя этот код:VB.Net Webclient Загрузить висячие

Private Sub UploadFile(ByVal local As String) 
    If wc.IsBusy = True Then Throw New Exception("An upload is already ongoing!") 

    wc.Credentials = New NetworkCredential(usr.ToString, pass.ToString) 'Set the credentials. 
    'total_dl_size = GetDownloadSize(url) 'Get the size of the current file. 

    Try 
     Dim FileName As String = Path.GetFileName(local) 'Get the current file's name. 
     AppendWarning("Uploading " & FileName & "... ") 'Download notice. 
     wc.UploadFileAsync(New Uri(info_srv & local), Path.Combine(mc_dir, local)) 'Download the file to the desktop (use your own path here). 
    Catch ex As Exception 
     AppendWarning("-ERR: Could not download file: " & local & ControlChars.NewLine) 
    End Try 
End Sub 
Private Sub AppendWarning(ByVal Text As String) 
    If tb_warnings.InvokeRequired Then 
     tb_warnings.Invoke(Sub() tb_warnings.AppendText(Text)) 
    Else 
     tb_warnings.AppendText(Text) 
    End If 

End Sub 

Private Sub wc_UploadProgressChanged(sender As Object, e As System.Net.UploadProgressChangedEventArgs) Handles wc.UploadProgressChanged 
    total_ul = e.BytesSent 
    Dim Progress As Integer = CType(Math.Round((baseline + total_ul) * 100)/total_ul_size, Integer) 
    If ProgressBar1.InvokeRequired Then 
     ProgressBar1.Invoke(Sub() 

           If Progress > 100 Then Progress = 100 
           If Progress < 0 Then Progress = 0 
           ProgressBar1.Value = Progress 
          End Sub) 
    Else 
     If Progress > 100 Then Progress = 100 
     If Progress < 0 Then Progress = 0 
     ProgressBar1.Value = Progress 
    End If 
    If lbl_progress.InvokeRequired Then 
     lbl_progress.Invoke(Sub() lbl_progress.Text = ((total_ul + baseline)/1024).ToString("N0") & " KB/" & (total_ul_size/1024).ToString("N0") & " KB") 
    Else 
     lbl_progress.Text = ((total_ul + baseline)/1024).ToString("N0") & " KB/" & (total_ul_size/1024).ToString("N0") & " KB | " & Progress.ToString & "%" 
    End If 

End Sub 
Private Sub wc_uploadFileCompleted(sender As Object, e As System.ComponentModel.AsyncCompletedEventArgs) Handles wc.UploadDataCompleted 
    If e.Cancelled Then 
     MessageBox.Show(e.Cancelled) 

    ElseIf Not e.Error Is Nothing Then 
     MessageBox.Show(e.Error.Message) 

    Else 
     If files.Count > 0 Then 
      AppendWarning("Upload Complete!" & ControlChars.NewLine) 
      baseline = baseline + total_ul 
      Dim file As String = files.Dequeue() 
      MsgBox(file) 
      UploadFile(file) 'Download the next file. 
     Else 
      AppendWarning("All Uploads Finished!" & ControlChars.NewLine) 
     End If 

    End If 

Однако, используя два моих тестовых файлов, он всегда останавливается на то, что иначе будет конец первый файл, который я ему дал, и не переходит на второй.

Однако у меня есть FTP-клиент, подключенный к этому же серверу, и когда я обновляюсь, я вижу (по крайней мере для первого файла) данные правильно загружаются.

Какие-либо предложения относительно неправильного использования здесь?

Редактировать, бревенчатый: http://pastebin.com/kqG28NGH

Спасибо за любую помощь!

+0

Вызываются ли 'wc_UploadProgressChanged' и' wc_uploadFileCompleted'? У вас такая же проблема с синхронной загрузкой? Что значит «останавливается» в любом случае? Покажите нам [файл журнала] (http://stackoverflow.com/q/9664650/850848). –

+0

@MartinPrikryl прогресс, завершение не похоже. Я еще не пробовал синхронно, а по остановкам, скажем, у меня есть файл размером в 11 КБ, в моей очереди, в качестве первого файла, нет явной прогрессии загрузки за пределами 11 КБ-1. Он не рассматривает, что файл закончен, ergo, ни один из других загрузок не продвигается. Я попытаюсь загрузить журнал, когда вернусь в свою систему завтра. Обратите внимание: если я сказал скачать здесь, это потому, что мой мозг запутан. Все такие экземпляры могут быть заменены загрузкой. –

+0

Немного не по теме из вашего вопроса, но вы не должны проверять 'InvokeRequired' для каждого элемента управления. Проверьте его один раз, затем сделайте все обновление одного и того же оператора 'If'. Вы можете просто проверить «Me.InvokeRequired», поскольку вызов всегда будет выполняться текущей формой (то есть, даже если вы вызываете 'yourControl.Invoke()'). –

ответ

0

Это работает для меня ... Я пытался подражать тому, что, по моему мнению, в вашей форме. Я тестировал с очередью из 8 файлов в диапазоне от 150 К до 400 К каждый. Я не мог понять, что вы пытаетесь сделать с индикатором выполнения. Mine заполняет для каждого файла и сбрасывается для следующего, заканчивая пустым с последним вызовом DoUpload, где больше нет файлов. Надеюсь, это поможет.

Imports System.IO 
Imports System.Net 

Public Class Form1 
    Const info_srv As String = "ftp://example.com/SomeFolder/" 
    Const usr As String = "" 
    Const pass As String = "" 

    Const mc_dir As String = "D:\Source\Folder" 

    Private WithEvents wc As New Net.WebClient 

    ' Contains file names only, no paths 
    Private Files As New Queue(Of String) 

    Private Sub Button1_Click(sender As Object, e As EventArgs) _ 
     Handles Button1.Click 

     wc.Credentials = New NetworkCredential(usr, pass) 

     ' Put the work in a task so UI is responsive 
     Task.Run(Sub() DoUpload()) 
    End Sub 

    Private Sub DoUpload() 
     ShowProgress("", 0) 

     If Files.Count > 0 Then 
      Dim local As String = Files.Dequeue 
      Dim FileName As String = Path.Combine(mc_dir, local) 

      AppendWarning("Uploading " & FileName & "... ") 

      Try 
       wc.UploadFileAsync(New Uri(info_srv & local), FileName) 
      Catch ex As Exception 
       AppendWarning("-ERR: Could not upload file: " & local & Environment.NewLine) 
      End Try 
     Else 
      AppendWarning("All Uploads Finished!" & Environment.NewLine) 
     End If 
    End Sub 

    Private Sub wc_UploadProgressChanged(sender As Object, e As UploadProgressChangedEventArgs) _ 
     Handles wc.UploadProgressChanged 

     ' Do not use e.ProgressPercentage - it's inaccurate by half by design per Microsoft 
     With String.Format("{0} KB/{1} KB", Int(e.BytesSent/1024).ToString("N0"), Int(e.TotalBytesToSend/1024).ToString("N0")) 
      ShowProgress(.ToString, Int(e.BytesSent/e.TotalBytesToSend * 100)) 
     End With 

    End Sub 

    Private Sub wc_UploadFileCompleted(sender As Object, e As UploadFileCompletedEventArgs) _ 
     Handles wc.UploadFileCompleted 

     Select Case True 
      Case e.Cancelled 
       MessageBox.Show("Cancelled") 
      Case e.Error IsNot Nothing 
       MessageBox.Show(e.Error.Message) 
      Case Else 
       AppendWarning("Upload Complete!" & Environment.NewLine) 

       ' I needed this just so I could see it work, otherwise too fast 
       Threading.Thread.Sleep(500) 

       DoUpload() 
     End Select 
    End Sub 

    Private Sub AppendWarning(ByVal Text As String) 
     If Me.InvokeRequired Then 
      Me.Invoke(Sub() AppendWarning(Text)) 
     Else 
      tb_warnings.AppendText(Text) 
     End If 
    End Sub 

    Private Sub ShowProgress(LabelText As String, Progress As Integer) 
     If Me.InvokeRequired Then 
      Me.Invoke(Sub() ShowProgress(LabelText, Progress)) 
     Else 
      Me.lbl_progress.Text = LabelText 
      Me.lbl_progress.Refresh() 

      Me.ProgressBar1.Value = Progress 
      Me.ProgressBar1.Refresh() 
     End If 
    End Sub 
End Class 
+0

Я подозреваю, что это был небольшой объем файлов, но я буду реализовывать это и видеть. Для сравнения, 2 файла, которые я использую, выходят на 27 МБ между ними (25,5 и 1,6). Я могу использовать фактический FTP, чтобы загрузить их на хост, но я не думаю, что есть ограничение на месте. Во всяком случае, я попробую ваше решение и посмотрю, работает ли оно. –

+0

Обновление: оно все еще висит. Мне кажется, что-то связано с объемом файла.Я пытаюсь найти некоторые другие библиотеки FTP, которые я нашел, поэтому в идеале одна из этих работ. –

+0

Я только что побежал над набором из 28 файлов, которые на всем протяжении 2 МБ, десяток из которых были более 10 МБ, и 4 из них от 25 МБ до 37 МБ. Все они загружены в порядке, размер файлов соответствует, случайный выбор открывается правильно. Я видел случайное заикание в баре прогресса, где он колебался бы на полпути и прыгал бы к завершению. Это то, о чем вы говорите, или что-то еще? Действительно ли вы загружаетесь, или это косметическая проблема? – MrGadget

0

Для потомков:

Проверьте сетевые настройки трассировки в конфигурации VB. Я использовал действительно многословную конфигурацию catch-all, которую я нашел, чтобы сделать трассировку, но, похоже, накладные расходы убивали загрузку. С тех пор я нашел намного более компактный набор xml для фокуса на ftp, чтобы изменить это, и файлы теперь загружаются должным образом. Всем спасибо!

Смежные вопросы