FTP 客户端和 HttpFileDownloader 组件 (控件)
FTP 客户端和 HttpFileDownloader 组件(控件)。
引言
我曾经需要一个简单、开源且健壮的 FTP 客户端来包含在我的项目中。 令我惊讶的是,尽管在包括 CodeProject 在内的各种网站上发布了许多 FTP 客户端,但我却找不到一个。 问题是质量:已发布的项目只是演示。 没有高质量的 FTP 客户端。
根据评分,最受欢迎的 CodeProject FTP 客户端可在此处获得:.NET 2.0 的 FTP 客户端库。 尽管进行了大量修复,但该组件并未按我预期的那样工作。 主要问题不在于修复(其中一些非常合理)——问题在于底层 FtpWebRequest
组件本身。
该组件旨在以无状态模式运行。 人们只能猜测做出如此“明智”决定背后的原因。 FTP 是一种基于连接的协议,任何将基于连接的协议融入到无连接组件中的尝试,从定义上来说,显然都无法很好地工作。 首先,放弃对连接状态的控制,我们能从中获得什么好处呢? 即使您将其隐藏在某处,连接也不会消失——这是协议的属性,而不是组件的属性。 我只能想到,该组件的设计者打算使该组件与 HttpWebRequest
保持一致。 但是,区别在于 HTTP 协议本质上是无状态的,而 FTP 不是。
FtpWebRequest 问题
那么,FtpWebRequest 有什么问题呢? 主要问题是响应时间。 连接到任何 FTP 客户端的服务器大约需要 2.5 秒。 FtpWebRequest 一致地显示 13.5 秒(连接到同一站点时)。 没有客户会在没有理由的情况下容忍额外的 11 秒延迟(增加 440%)。 除此之外,如果您不明确地将 KeepConnectionAlive
设置为 false
,则系统将无法正常工作。 (默认情况下应该是false
。)
解决方案
幸运的是,我在上述文章的 评论中找到了一个很好的解决方案。 该解决方案是 edtFTPnet。 这是一个最高质量的开源库(信不信由你)。 该库由 Enterprise Distributed Technologies 设计。 他们也有 FTP 组件的高级版本(带有 SSL 和其他功能),但它们不是免费的。 开源版本的唯一问题是它缺乏多线程支持。 但这不是真正的问题——如果您有经验,几乎可以为任何东西创建多线程包装器。 该组件是为 edtFTPnet 设计的多线程包装器,设计为 Windows Forms 控件,并添加了一些小的补充,例如状态栏支持和线程处理。
核心功能
- 在单独的线程中运行。
- 能够在任何时候取消传输。
- 进度条支持。
- 显示估计的剩余时间。
- 显示传输速度。
如何使用控件
将根目录(和子目录)复制到任何位置。 在 Visual Studio 工具箱中创建一个新选项卡。 通过浏览 FTPLib,将库注册到 Visual Studio 工具箱。 您将能够在选项卡上看到控件。
将控件拖到您的窗体上。 将进度条放在窗体上。 选择您的 FtpControl
并在 ProgrBar
控件的属性中选择您的状态栏。
通过选择并双击 StatusUpdateEvent
来创建一个状态事件。
其余的从示例中可以很清楚地看出。
HttpFileDownloader
第二个组件是一个 HttpFileDownloader
组件(控件)。 两个组件都继承自 BaseDownloader
组件。
新版本
如果发布了较新版本,它将在此处提供。