如何使用foreach()和ftpwebrequest优化我的FTP下载

本文关键字:优化 我的 FTP 下载 ftpwebrequest 何使用 foreach | 更新日期: 2023-09-27 18:36:59

这是我正在使用的代码,它可以工作,但应用程序的ftp部分大约需要5分钟。

他们自己的文件不是太大,但我想优化应用程序,我觉得这是最好的起点。

我尝试做的是下载 4 个特定文件。

以下是文件大小:

1 - ~48MB2 - ~856k3 - ~25MB4 - ~49MB

// BEGIN FTP 
                WebClient request = new WebClient();
                request.Credentials =
                       new NetworkCredential(this.userNameRTF.Text,
                                                this.passRTF.Text);

                string[] ftpFile = new string[4];
                ftpFile[0] = "1";
                ftpFile[1] = "2";
                ftpFile[2] = "3";
                ftpFile[3] = "4"; 

                foreach(string s in ftpFile) 
                {
                    string ftpFileName = s;                        

                    byte[] fileData =
                            request.DownloadData(this.ftpHost
                                                   + this.ftpPath.Text + ftpFileName);                  
                    FileStream file =
                        File.Create(@"''nas03'customerftp'" + custName.Text + @"'" + ftpFileName);
                    file.Write(fileData, 0, fileData.Length);
                    file.Close(); 
                } 

感谢您的帮助!

如何使用foreach()和ftpwebrequest优化我的FTP下载

为什么不使用 API 处理这些:

WebClient request = new WebClient();
request.Credentials = new NetworkCredential(this.userNameRTF.Text,
                                            this.passRTF.Text);
string[] ftpFiles = new[] { "1", "2", "3", "4" };
var tasks = ftpFiles.Select(f => request.DownloadFileTaskAsync(
                         this.ftpHost + this.ftpPath.Text + ftpFileName,
                         @"''nas03'customerftp'" + custName.Text + @"'" + ftpFileName));
Task.WaitAll(tasks.ToArray());

除了简化代码外,这将同时下载和保存文件。

请注意,可以通过将最后一行切换为

await Task.WhenAll(tasks);

假设您使用的是 .NET 4,则可以使用较旧的 DownloadFileAsync 方法:

WebClient request = new WebClient();
request.Credentials = new NetworkCredential(this.userNameRTF.Text,
                                            this.passRTF.Text);
var ftpFiles = new[] { "1", "2", "3", "4" };
var ce = new CountdownEvent(ftpFiles.Length);
request.DownloadFileCompleted += (o,e) => ce.Signal();
foreach(var file in ftpFiles)
    request.DownloadFileAsync(new Uri(this.ftpHost + this.ftpPath.Text + ftpFileName),
                         @"''nas03'customerftp'" + custName.Text + @"'" + ftpFileName));
ce.Wait();

您需要告诉您的文件来自哪里,使用哪个带宽,以及它们与哪个带宽一起去哪里。从几行代码来看,除了您的互联网连接本身之外,似乎没有任何明显的瓶颈。只需计算使用带宽可以下载多少数据。