Быстро скачивайте много маленьких файлов с FTP - PullRequest
0 голосов
/ 09 сентября 2018

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

Это мой текущий способ загрузки:

Using ftpClient As New WebClient()
    ftpClient.Credentials = New System.Net.NetworkCredential(ftpuser, ftppassword)
    For i As Integer = 0 To directoriesDownload.Count - 1
        If directoriesDownload(i).Contains(".") Then
            If Sync_BackgroundWorker.CancellationPending = True Then
                Exit Sub
            End If
            Dim path As String = "ftp://" & ftpserver & "Datenbank/" + directoriesDownload(i).ToString()
            Dim trnsfrpth As String = config.rootpath & "ServerDownload\" + directoriesDownload(i).ToString()
            ftpClient.DownloadFile(path, trnsfrpth)
            filenametodownload = directoriesDownload(i).ToString()
            filesdownloaded += 1
            Sync_BackgroundWorker.ReportProgress(filesdownloaded)
        End If
    Next
    ftpClient.Dispose()
End Using

Существует ли более быстрый способ загрузки сотен небольших файлов (до 10 КБ) с FTP-сервера в VB.NET?

Было бы лучше, если бы была возможность войти в FTP только один раз вместо входа и выхода для каждого файла.

Я обнаружил, что у кого-то есть такая же проблема, но без результата: Использование FTP для загрузки каждого файла * WHILE * получение списка файлов

Я также пробовал многопоточность с циклом Parallel.For, но WebClient не работает с многопоточностью. То же самое, если я попробую с ftpClient.DownloadFileAsync(New Uri(path), trnsfrpth).

1 Ответ

0 голосов
/ 09 сентября 2018

Существует ли более быстрый способ загрузки сотен небольших файлов (до 10 КБ) с FTP-сервера в VB.NET?

...

Я также пробовал многопоточность с циклом Parallel.For, но WebClient не работает с многопоточностью. То же самое, если я попробую с ftpClient.DownloadFileAsync (Новый Uri (путь), trnsfrpth).

Многопоточность - это путь. Это не правда, что WebClient не поддерживает многопоточность. Почему бы и нет?

Если у вас есть проблема с реализацией многопоточных передач по FTP, вам следует задать вопрос об этом, а не задавать вопрос о других (и, возможно, несуществующих) способах.


Было бы лучше, если бы была возможность войти в FTP только один раз вместо входа и выхода для каждого файла.

Ваш код выполняет вход в FTP только один раз .

См. C # - FtpWebRequest - Несколько запросов по одному и тому же соединению / логину - То, что там написано о FtpWebRequest, одинаково верно для WebClient, так как WebClient использует FtpWebRequest внутри.

...