2014-10-25 2 views
0

У меня есть вопрос относительно библиотеки ftp с C#. Мне нужно загрузить 9000 txt-файлов с ftp-сервера. Station.ToUpper() - это имя файла, поэтому для каждого файла мне нужно новое ftp-соединение. Для одного файла требуется около одной секунды. Файлы txt содержат две строки. Поэтому для всех файлов требуется около полутора часов. Есть ли лучшее/быстрое решение?C# FTP скачать файлы медленные

  // Get the object used to communicate with the server. 
      FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpAddress + station.ToUpper()); 
      //request.UsePassive = false; 
      request.Method = WebRequestMethods.Ftp.DownloadFile; 

      // This example assumes the FTP site uses anonymous logon. 
      request.Credentials = new NetworkCredential("anonymous", "[email protected]"); 

      FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 

      Stream responseStream = response.GetResponseStream(); 
      StreamReader reader = new StreamReader(responseStream); 
+0

ознакомьтесь с этим http://stackoverflow.com/questions/19600065/how-can-i-optimize-my-ftp-download-using-foreach-and-ftpwebrequest – MethodMan

ответ

2

Там не так много, что вы делаете неправильно в этом коде, за то, что вы не вызывающий Dispose() на ваши потоках или объектах, за исключением ответа. Сделайте это первым, чтобы убедиться, что у вас не так много ресурсов на клиенте или что-то в этом роде.

Кроме этого у вас здесь не так много вариантов, и многое зависит от того, что вы можете делать на стороне сервера.

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

Оптимально, файлы будут заархивированы (.ZIP или .TGZ) на сервере. Вероятно, это не вариант, если у вас больше нет контроля над процессом.

+0

Спасибо за ваш ответ, как он работает с Dispose()? – user2644964

+0

Просто оберните запрос «FtpWebResponse response = (FtpWebResponse) request.GetResponse();» в блоке using() {}. –

2

Используйте команду MGET, чтобы избежать повторного установления соединения каждый раз. Клиент System.Net не поддерживает MGET, поэтому вам придется использовать стороннюю библиотеку или скрипт ftp.exe. Независимо от клиента Вы выбираете, журнал FTP будет выглядеть следующим образом:

USER anonymous 
PASS [email protected] 
CWD path/to/file 
// to get 3 named files 
MGET file1.txt file2.txt file3.txt 
// or to get all files matching a pattern 
MGET *.txt 

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

Одна из библиотек, которая может представлять интерес, - FTPLib, что позволяет избежать разрыва канала по каждой команде. Однако будьте осторожны, поскольку FTPLib основан на wininet, который недопустим для использования в службе NT.

Я также посмотрю LumiSoft, проект с открытым исходным кодом с дружественной лицензией и DotNetFtpLib, хотя я не использовал ни один из них и не могу говорить об их стабильности или функциональности. На стороне скриптинга посмотрите "Using FTP Batch Scripts".

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