Почему загрузка по Ftp происходит так медленно с помощью c # / FtpWebRequest

#c# #.net #ftp #ftpwebrequest

#c# #.net #ftp #ftpwebrequest

Вопрос:

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

У меня нет никаких проблем с Filezilla, и мое соединение в порядке.

Я думаю о реализации функций FTP, вот мой код :

     public static string DownloadFromList(string strParam,string filePath)
    {
        string[] FilesToDownload = strParam.Split('n');

        try
        {
            FtpWebRequest reqFTP;

            foreach(string file in FilesToDownload)
            {
                string tmpfile = file;

                if (tmpfile.Contains("n"))
                {
                    tmpfile = tmpfile.Replace('n', ' ');
                }
                FileInfo fileToDownload = new FileInfo(tmpfile);
                tmpfile = fileToDownload.Name;

                FileStream outputStream = new FileStream(filePath.Trim()   "\"   tmpfile.Trim(), FileMode.Create);

                if (strDirectory.Trim() != "")
                {
                    reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://"   strHost.Trim()   "/"   strDirectory.Trim()   "/"   tmpfile.Trim()));
                }
                else
                {
                    reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://"   strHost.Trim()   "/"   tmpfile.Trim()));
                }

                reqFTP.ConnectionGroupName = "MyGroupName"; 

                reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
                reqFTP.UseBinary = true;
                reqFTP.KeepAlive = true;
                reqFTP.Timeout = -1;
                reqFTP.Credentials = new NetworkCredential(strUser.Trim(), strPass.Trim());
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                Stream ftpStream = response.GetResponseStream();
                StreamReader reader = new StreamReader(ftpStream, System.Text.Encoding.UTF8);
                long cl = response.ContentLength;
                int bufferSize = 8192;
                char[] bytesInStream = new char[8192];
                int readCount;

                StreamWriter sw = new StreamWriter(outputStream);
                int len;
                while ((len = reader.Read(bytesInStream, 0, bytesInStream.Length)) > 0)
                {
                    sw.Write(bytesInStream, 0, len);
                }
                sw.Close();
                outputStream.Close();
                ftpStream.Close();
                response.Close();
            }

            return "ok";
        }
        catch (Exception ex)
        {
            return (ex.Message);
        }
    }
  
  • Необходимо ли устанавливать useBinary = true ?
  • Для KeepAlive установлено значение true, чтобы использовать то же соединение, но верно ли это?
  • Можно ли установить учетные данные только один раз?

Как я могу это улучшить, пожалуйста?

Большое спасибо 🙂

С наилучшими пожеланиями,

Комментарии:

1. Используйте профилировщик или приостановите отладчик 10 раз. Где это чаще всего останавливается? Кстати, декодирование в текст и последующее немедленное кодирование не имеет смысла. Просто передайте байты с помощью Stream.Copy .

2. Я думаю, что это связано с воссозданием соединения для каждого файла

3. Как вы узнали?

4. Тогда вам, вероятно, следует измерить, как я предложил, чтобы быть уверенным. На данный момент это просто предположение. Как кто-нибудь может прямо сейчас сказать вам, в чем проблема? Кроме того, я ожидаю, что вы ответите на мои замечания относительно обработки строк.