Загрузка нескольких файлов с использованием FTP сбой только во время выполнения (не отладка) - PullRequest
0 голосов
/ 02 сентября 2010

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

Просто для ясности, функция работает, когда ее вызывают один раз, но при ее вызове несколько раз в цикле for выдается сообщение об ошибке: 550 Указанное имя сети больше не доступно.

Пожалуйста, помогите Асаф

private void downloadFile(string sourceFile, string targetFolder)
            {            
                string remoteFile = sourceFile.Replace("\\","//");
                string localFolder = targetFolder + "\\" + sourceFile.Substring(sourceFile.LastIndexOf("\\")+1); 
                string filename = "ftp://" + ftpServerIP + "//" + remoteFile;

                FtpWebRequest ftpReq = (FtpWebRequest)WebRequest.Create(filename);
                ftpReq.Method = WebRequestMethods.Ftp.DownloadFile;
                ftpReq.Credentials = new NetworkCredential(ftpUserID, ftpPassword);
                ftpReq.UseBinary = true;
                ftpReq.Proxy = null;
                ftpReq.KeepAlive = false; //'3. Settings and action
                try
                {                
                    using (System.Net.FtpWebResponse response = (System.Net.FtpWebResponse)(ftpReq.GetResponse()))
                    {
                        using (System.IO.Stream responseStream = response.GetResponseStream())
                        {      
                            using (System.IO.FileStream fs = new System.IO.FileStream(localFolder, System.IO.FileMode.Create))
                            {
                                Byte[] buffer = new byte[2047];
                                int read = 0;
                                do
                                {
                                    read = responseStream.Read(buffer, 0, buffer.Length);
                                    fs.Write(buffer, 0, read);
                                } while (read == 0);
                                responseStream.Close();
                                fs.Flush();
                                fs.Close();
                            }
                            responseStream.Close();
                        }
                        response.Close();
                    }                
                }
                catch (WebException ex)
                { 
                    FtpWebResponse response = (FtpWebResponse)ex.Response;
                    Console.Out.WriteLine(response.StatusDescription);
                }
            }

1 Ответ

0 голосов
/ 02 ноября 2010

В цикле чтения есть ошибка, которая приводит к усечению больших файлов. Использование:

int read;
while ((read = responseStream.Read(buffer, 0, buffer.Length)) != 0)
{
    fs.Write(buffer, 0, read);
}

С этим изменением мне удалось загрузить несколько больших файлов по FTP без каких-либо исключений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...