【问题标题】:C# FTP download files slowC# FTP 下载文件慢
【发布时间】:2014-10-25 21:00:54
【问题描述】:

我对 C# 中的 ftp 库有疑问。我需要从 ftp 服务器下载 9000 个 txt 文件。 Station.ToUpper() 是文件名,因此对于每个文件,我都需要一个新的 ftp 连接。对于一个文件,大约需要一秒钟。 txt 文件包含两行。因此,对于所有文件,大约需要一个半小时。有没有更好/更快的解决方案?

            // Get the object used to communicate with the server.
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpAddress + station.ToUpper());
            //request.UsePassive = false;
            request.Method = WebRequestMethods.Ftp.DownloadFile;

            // This example assumes the FTP site uses anonymous logon.
            request.Credentials = new NetworkCredential("anonymous", "janeDoe@contoso.com");

            FtpWebResponse response = (FtpWebResponse)request.GetResponse();

            Stream responseStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(responseStream);

【问题讨论】:

标签: c# ftp webrequest ftpwebrequest


【解决方案1】:

除了您没有在流或响应对象上调用 Dispose() 之外,您在这段代码中没有做错太多。首先这样做以确保您不会以某种方式耗尽客户端上的资源或其他什么。

除此之外,您在这里没有太多选择,很大程度上取决于您可以在服务器端做什么。

首先,您可以尝试使用线程一次下载一堆文件。您需要试验这如何影响您的吞吐量。它可能会线性扩展一段时间,然后下降。如果你打开了太多的连接,你可能会激怒服务器的维护者,或者它可能会开始拒绝你的连接。保守一点。

最好在服务器上压缩文件(.ZIP 或 .TGZ)。如果您无法更好地控制流程,这可能不是一个选项。

【讨论】:

  • 感谢您的回答 它如何与 Dispose() 一起使用?
  • 只需包装“FtpWebResponse response = (FtpWebResponse)request.GetResponse();”在 using() {} 块中。
【解决方案2】:

使用MGET 命令避免每次都重新建立连接。 System.Net 客户端不支持MGET,因此您必须使用第三方库或脚本ftp.exe。无论您选择哪种客户端,FTP 日志都会如下所示:

USER anonymous
PASS janeDoe@contoso.com
CWD path/to/file
// to get 3 named files
MGET file1.txt file2.txt file3.txt
// or to get all files matching a pattern
MGET *.txt

文件传输将使用相同的控制会话,避免登录和其他网络开销。

FTPLib 是一个可能感兴趣的库,它可以避免在每个命令上拆除通道。但是要小心,因为 FTPLib 基于wininet,它不允许在 NT 服务中使用。

我还想看看LumiSoft,一个具有友好许可证的开源项目,和DotNetFtpLib,虽然我没有使用过,也无法谈论它们的稳定性或功能集。在脚本方面,看看"Using FTP Batch Scripts"

【讨论】:

    猜你喜欢
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    相关资源
    最近更新 更多