使用FTP下载多个文件仅在运行时崩溃(不调试)

时间:2010-09-01 22:59:23

标签: c# memory-management ftp

我认为我的内存问题是应该从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 :(得分:0)

读取循环中存在导致大文件被截断的错误。使用:

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

通过这种改变,我可以通过FTP下载大量文件而不会遇到异常。