我正在尝试获得ftp下载文件的速度,但有时我得到无限的原因

本文关键字:无限 文件 下载 ftp 速度 | 更新日期: 2023-09-27 18:33:36

这是计算下载速度的方法:

private void CalculateDownload(int ln, BackgroundWorker backw)
{
    string speed;
    DateTime DownloadStart = DateTime.Now;
    int dnsize = ln;
    if (dnsize > 0)
    {
        DateTime DownloadEnd = DateTime.Now;
        TimeSpan DownloadSub = DownloadEnd.Subtract(
            DownloadStart);
        speed = string.Format("Download speed: {0:F0} bps'n",
            (dnsize / DownloadSub.TotalMilliseconds) * 1000);
        backw.ReportProgress(0,speed);
    }
}

这是我用来从ftp服务器下载文件的方法。每次一个文件。

public int FtpDownload(object sender, string file, string filesdirectories, string fn)
{
    string tmp = "";
    BackgroundWorker bw = sender as BackgroundWorker;
    string filenameonly = Path.GetFileName(file);
    string ftpdirectories = Path.Combine(ftpcontentdir, filesdirectories);
    string fileurl = "ftp://" + file;
    FtpWebRequest reqFTP;
    reqFTP = (FtpWebRequest)FtpWebRequest.Create(fileurl);
    reqFTP.Credentials = new NetworkCredential(UserName, Password);
    reqFTP.UseBinary = true;
    reqFTP.UsePassive = true;
    reqFTP.KeepAlive = true;
    reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
    try
    {
        FtpWebResponse response = (FtpWebResponse)reqFTP.
            GetResponse();
        Stream responseStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(responseStream);
        tmp = reader.ReadToEnd();
        CalculateDownload(tmp.Length, bw);
        reader.Close();
        response.Close();
    }
    catch (WebException e)
    {
        Console.WriteLine(e.ToString());
    }
    return tmp.Length;
}

计算下载方法中的第一个文件下载我正在获取文件大小:

变量 ln 例如为 66349

然后变速包含: 下载速度:21367 bps在下一个文件中:

ln = 59892

那么速度是:下载速度:25100 bps

当我使用断点时,这工作正常,但是如果我不使用断点而不是 25100 bps,我会看到无限 bps

在form1中,我发送文件进行下载,如下所示:

private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
{
    for (int i = 0; i < numberOfFiles.Count; i++)
    {
        int fn = numberOfFiles[i].IndexOf(txtHost.Text, 0);
        string fn1 = numberOfFiles[i].Substring(txtHost.Text.Length + 1, numberOfFiles[i].Length - (txtHost.Text.Length + 1));
        string dirs = Path.GetDirectoryName(fn1);
        string filename = Path.GetFileName(fn1);
        ftpProgress1.FtpDownload(sender, numberOfFiles[i], dirs, filename);
    }
}

表单 1 中的进度更改事件:

private void backgroundWorker2_ProgressChanged(object sender, ProgressChangedEventArgs e)
{           
    this.toolStripStatusLabel1.Text = e.UserState.ToString();
}
为什么当我使用断点时,它会显示

下载时间的每个文件,但没有断点,它会显示无穷大?

我正在尝试获得ftp下载文件的速度,但有时我得到无限的原因

以 0 在使用浮点数或双精度数时给出无穷大。

您可以添加额外的检查以查看是否经过了 0 毫秒在这种情况下,不计算值。时间 = 0,因为未下载任何内容然而,该值可能对用户没有用。

您还可以通过传递一个实现接口的类来添加单元测试,该类实现具有正确模拟回调的方法。报告进度,例如:

private void CalculateDownload(int ln, IBackgroundWorker backw)

以计算在时间 = 0、时间 = 1 等情况下会发生什么。

最后那行:

int dnsize = ln;

没有用,因为您已经将变量传递给了函数

如果您在使用断点时得到结果,但当您让它运行时无穷大,我怀疑您在不到 1 毫秒的时间内下载它,因此您除以 0。您可以尝试使用更大的文件,看看是否可以在没有断点的情况下获得更好的结果。或者考虑一些像DateTime.Ticks这样精确的东西。

请注意,string.length 将是字节而不是位。