为什么我的ftp上传方法这么慢?

时间:2012-12-25 14:49:23

标签: c# ftp ftpwebrequest

我编写了一个控制台应用程序,用于从FTP下载文件,然后上传到其他FTP位置。 文件下载大约需要10秒钟,但上传大约需要6分钟。 有256个文件,每个大小约5-30KB。非常小。

上传和下载代码非常相似,它遍历目录中的所有文件然后上传。它如下所示非常简单,它迭代并从D:\ LEV \文件夹上传文件到ftp。

编辑:这是在Azure'小型'Windows虚拟机上运行的,所以我假设带宽不是问题? 此外,我在另一个使用Windows ftp.exe上传的虚拟机上执行相同的任务,它比我在同一台计算机上的控制台应用程序快2倍。

任何线索为什么它如此缓慢,或者有办法提高速度?

static public void Upload(string file1)
{        
    string upftpServerIP = "ftp://ftp.domain.co.uk/lev/";
    string upftpUserID = "username";
    string upftpPassword = "password";

    string uri = upftpServerIP + file1;
    Uri serverUri = new Uri(uri);
    if (serverUri.Scheme != Uri.UriSchemeFtp)
    {
       return;
    }
    FtpWebRequest reqFTP;
    reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(upftpServerIP + file1));
    reqFTP.Credentials = new NetworkCredential(upftpUserID, upftpPassword);
    reqFTP.KeepAlive = false;
    reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
    reqFTP.UseBinary = true;
    reqFTP.Proxy = null;
    reqFTP.UsePassive = true;

    Console.WriteLine("Uploading " + file1);

    FileStream fs = File.OpenRead(@"D:\LEV\" + file1);
    byte[] buffer = new byte[fs.Length];
    fs.Read(buffer, 0, buffer.Length);
    fs.Close();
    Stream ftpstream = reqFTP.GetRequestStream();
    ftpstream.Write(buffer, 0, buffer.Length);
    ftpstream.Close();
}

static public string[] GetFileListUpload()
{
    string[] uploadFiles = Directory.GetFiles(@"D:\LEV\", "*.*", SearchOption.TopDirectoryOnly);
    return uploadFiles;
}

1 个答案:

答案 0 :(得分:5)

这里有几个要考虑的因素:

  • 您的互联网连接无法保证对称。大多数互联网连接计划(至少在我的地区)提供的上传带宽是下载带宽的1/8。

  • FTP服务器本身可能会限制传入连接的带宽。

  • FTP服务器也可能会限制每次上传的最大带宽 。在这种情况下,您将从多线程上传,一次上传多个文件中受益匪浅。