#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. Тогда вам, вероятно, следует измерить, как я предложил, чтобы быть уверенным. На данный момент это просто предположение. Как кто-нибудь может прямо сейчас сказать вам, в чем проблема? Кроме того, я ожидаю, что вы ответите на мои замечания относительно обработки строк.