通过WebClient / FTP下载大文件的问题

时间:2011-12-06 19:57:48

标签: c# .net winforms ftp webclient

我目前正在构建一个应用程序,其中包括从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.DownloadFilefor循环同步执行此操作以循环浏览我的FilesToDownload列表。它正确下载第一个文件,并在第二次下载开始时出现异常:“底层连接已关闭:接收时发生意外错误”。

最后,我尝试使用edtFTPnet通过FTP进行此操作,但我面临着下载速度问题(即我的下载速度与WebClient一致,我只得到1/3使用edtFTPnet库获得全速。

有什么想法?我不得不承认我的想法已经不多了。

2 个答案:

答案 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命令,其偏移量等于传输停止的数据流中的位置(即远程文件的总字节数 - 目前下载的字节数量)。这样做可以获取本地文件中缺少的剩余字节。