2011-12-06 75 views
3

我目前正在构建一个应用程序,其中包括从FTP服务器下载大文件。一切工作正常的小文件(< 50 MB),但我下载的文件是更大的方式,主要超过2 GB。通过WebClient/FTP下载大文件问题

我一直在使用一个使用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库)。

有什么想法?我不得不承认,我在这里没有想法。

+0

尝试创建一个文件流或一个MemoryStream通过获取字节和当你说“大”时做什么,你参照GIGS或MB的大的定义是什么 – MethodMan

+0

我的大文件超过2演出。 – Xeaz

+0

记得操作系统处理2 gig的文件大小,但4 gig限制是如果您使用.NET 4.0 Microsoft更改了.NET 4.0中的文件大小限制,所以您将不得不更改您的int大小为多头或Int64类型可以粘贴你正在使用的确切例子..数据的演出总是需要更长的时间。记住交换文件和tmp文件,它不只是一个直接的副本,你必须有目标媒体上的可用存储空间 – MethodMan

回答

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(); 
    } 
} 
0

忘记更新此主题,但我想了一下如何解决这个问题。

问题是由于某种原因,为文件传输打开的数据连接随机超时,或者在传输结束之前被服务器关闭。我一直无法弄清楚为什么,但是由于我的电脑和远程服务器之间有大量的本地和外部网络接口。由于它完全是随机的(即传输对于连续五个文件工作正常,超时一个文件,对于下列文件等工作正常),问题可能与服务器或网络相关。

我现在在下载过程中捕获FTP客户端对象引发的任何FTP异常,并发出REST命令,其偏移量等于传输停止的数据流中的位置(即远程文件的总字节量 - 当前下载的字节数量)。这样做可以获取本地文件中缺少的剩余字节。