【发布时间】:2012-01-14 09:54:56
【问题描述】:
我目前正在构建一个应用程序,除其他外,它将从 FTP 服务器下载大文件。小文件(
我一直在尝试使用 DownloadfileAsync() 和列表系统的 Web 客户端,因为由于它们的大小,我一个接一个地下载这些文件。
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 库)。
有什么想法吗?我不得不承认我在这里的想法已经用完了。
【问题讨论】:
-
尝试通过获取字节来创建文件流或 MemoryStream 来执行此操作,当您说“大”时,您对 GIGS 或 MB 的大定义是什么
-
我的大型文件超过 2 个演出。
-
记住操作系统处理的文件大小为 2 gig,但如果您使用 .NET 4.0,则限制为 4 gig Microsoft 更改了 .NET 4.0 中的文件大小限制,因此您必须将您的 int 大小更改为longs 或 Int64 类型您可以粘贴您正在使用的确切示例.. 数据的演出也总是需要更长的时间。请记住交换文件和 tmp 文件,它不仅仅是一个直接副本,您必须在目标媒体上拥有可用的存储空间
标签: c# .net winforms ftp webclient