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

本文关键字:文件 问题 下载 WebClient FTP 通过 | 更新日期: 2023-09-27 18:17:11

我目前正在构建一个应用程序,除其他外,它将从FTP服务器下载大文件。对于小文件,一切都很好(<50 MB),但我下载的文件要大得多,主要超过2gb。

我一直在尝试使用Webclient DownloadfileAsync()和一个列表系统,因为我一个接一个地下载这些文件,因为它们的大小。

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列表。它正确下载了第一个文件,当第二次下载应该开始时,我得到一个异常:"底层连接已关闭:接收时发生意外错误"。

最后,我试着通过FTP使用edtFTPnet,但我面临下载速度问题(即我的下载全速与WebClient,我只得到全速与edtFTPnet库的1/3)。

任何想法吗?

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

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

忘记更新这个线程,但我知道如何在一段时间前排序。

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

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