Skip to main content
 首页 » 编程设计

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

2024年02月01日23zdz8207

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

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

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

这里是文件大小:

1 - ~48mb 2 - ~856k 3 - ~25mb 4 - ~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();  
                }  

感谢您的帮助!

请您参考如下方法:

为什么不直接使用 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();