2

在我的应用程序中,我需要从 FTP 服务器下载一些文件。我通过 for 循环进行编码以逐个下载,它工作正常。我的问题是它的每个文件的处理速度都很慢,因为它会提供凭据。因此,如果我可以将这些文件压缩到 FTP 服务器中,则可以快速下载。如果有办法请指导我。这里我的代码:

块引用

    private void button1_Click(object sender, EventArgs e)
    {
        string[] list = GetFileList();
        DownloadFile(list, "e:\\sample\\");
    }

    private String[] GetFileList()
    {
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create(new Uri(_remoteHost));
        request.Credentials = new NetworkCredential(_remoteUser, _remotePass);
        request.Method = WebRequestMethods.Ftp.ListDirectory;

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

        string FileNames = reader.ReadToEnd();
        string[] Files = Regex.Split(FileNames, "\r\n");
        return Files;
    }


    private void DownloadFile(string[] fileList, string destination)
    {
        for (int i = 2; i <= fileList.Length - 1; i++)
        {
            FtpWebRequest request = (FtpWebRequest)WebRequest.Create(_remoteHost + fileList[i]);
            request.Method = WebRequestMethods.Ftp.DownloadFile;
            request.Credentials = new NetworkCredential(_remoteUser, _remotePass);
            FtpWebResponse response = (FtpWebResponse)request.GetResponse();
            Stream responseStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(responseStream);

            StreamWriter writer = new StreamWriter(destination + fileList[i]);
            writer.Write(reader.ReadToEnd());

            writer.Close();
            reader.Close();
            response.Close();
    }
}

块引用

4

3 回答 3

1

您可以重复使用凭据,这可能会加快您的速度...

private void DownloadFile(string[] fileList, string destination)
{

    var myCred = new NetworkCredential(_remoteUser, _remotePass);

    for (int i = 2; i <= fileList.Length - 1; i++)
    {
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create(_remoteHost + fileList[i]);
        request.Method = WebRequestMethods.Ftp.DownloadFile;
        request.Credentials = myCred;
        FtpWebResponse response = (FtpWebResponse)request.GetResponse();
        Stream responseStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(responseStream);

        StreamWriter writer = new StreamWriter(destination + fileList[i]);
        writer.Write(reader.ReadToEnd());

        writer.Close();
        reader.Close();
        response.Close();
}

}

于 2012-09-17T11:39:55.490 回答
1

如果您使用的是 .NET 3.0 或更高版本,则可以使用 System.IO.Packaging 命名空间中的ZipPackage 类。我还没有尝试压缩远程计算机上存在的文件,但您可以尝试一下,否则您可能需要编写一个小作业来压缩文件并将其部署到远程(ftp)服务器上。

于 2012-09-17T11:57:42.530 回答
1

为什么不使用用户名和密码启动一次 FtpWebRequest,然后在 foreach 循环中为所有文件使用它,而不是每轮创建一个新文件?

另一种方法是使用 3rd 方工具(例如:http ://www.rebex.net/ftp-ssl.net/ ),它可能更快,但您必须对其进行测试,看看这个:https://stackoverflow.com/a/2343689/395659

第三种方法可能是让一个作业在服务器上运行,该作业在一段时间内创建一次 ZIP 文件,然后您将其作为 Zip 文件下载,如您的问题中所述。

于 2012-09-17T11:35:28.550 回答