我目前正在构建一个应用程序,其中包括从FTP服务器下载大文件。一切都适用于小文件(<50 MB),但我正在下载的文件更大,主要超过2 GB。
我一直在尝试使用DownloadfileAsync()和列表系统的Webclient,因为我们正在逐个下载这些文件。
DownloadClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgress);
DownloadClient.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadCompleted);
private void FileDownload()
{
DownloadClient.DownloadFileAsync(new Uri(@"ftp://" + RemoteAddress + FilesToDownload[0]), LocalDirectory + FilesToDownload[0]));
}
private void DownloadProgress(object sender, DownloadProgressChangedEventArgs e)
{
// Handle progress
}
private void DownloadCompleted(object sender, AsyncCompletedEventArgs e)
{
FilesToDownload.RemoveAt(0);
FileDownload();
}
在小文件上以这种方式完全正常工作,它们都是逐个下载的,报告进度并在每个文件后触发DownloadCompleted
。我面对大文件的这个问题是它启动了第一次下载而没有任何问题,但之后没有做任何事情。由于某些原因,DownloadCompleted
事件永远不会触发。看起来WebClient
不知道该文件已经完成下载,这是一个问题,因为我正在使用此事件在FilesToDownload列表中启动下一个下载。
我还尝试使用WebClient.DownloadFile
和for
循环同步执行此操作以循环浏览我的FilesToDownload
列表。它正确下载第一个文件,并在第二次下载开始时出现异常:“底层连接已关闭:接收时发生意外错误”。
最后,我尝试使用edtFTPnet通过FTP进行此操作,但我面临着下载速度问题(即我的下载速度与WebClient
一致,我只得到1/3使用edtFTPnet库获得全速。
有什么想法?我不得不承认我的想法已经不多了。
答案 0 :(得分:0)
public string GetRequest(Uri uri, int timeoutMilliseconds)
{
var request = System.Net.WebRequest.Create(uri);
request.Timeout = timeoutMilliseconds;
using (var response = request.GetResponse())
using (var stream = response.GetResponseStream())
using (var reader = new System.IO.StreamReader(stream))
{
return reader.ReadToEnd();
}
}
答案 1 :(得分:0)
忘了更新这个帖子,但我想了解如何解决这个问题。
问题在于,为文件传输而打开的数据连接由于某种原因而随机超时,或者在传输结束之前由服务器关闭。然而,由于我的计算机和远程服务器之间存在大量本地和外部网络接口,我无法弄清楚原因。因为它是完全随机的(即传输连续五个文件正常工作,一个文件超时,适用于以下文件等),问题可能与服务器或网络有关。
我现在正在捕获FTP客户端对象在下载过程中引发的任何FTP异常,并发出一个REST命令,其偏移量等于传输停止的数据流中的位置(即远程文件的总字节数 - 目前下载的字节数量)。这样做可以获取本地文件中缺少的剩余字节。