我正在尝试获得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();
}
为什么当我使用断点时,它会显示下载时间的每个文件,但没有断点,它会显示无穷大?
除
以 0 在使用浮点数或双精度数时给出无穷大。
您可以添加额外的检查以查看是否经过了 0 毫秒在这种情况下,不计算值。时间 = 0,因为未下载任何内容然而,该值可能对用户没有用。
您还可以通过传递一个实现接口的类来添加单元测试,该类实现具有正确模拟回调的方法。报告进度,例如:
private void CalculateDownload(int ln, IBackgroundWorker backw)
以计算在时间 = 0、时间 = 1 等情况下会发生什么。
最后那行:
int dnsize = ln;
没有用,因为您已经将变量传递给了函数
如果您在使用断点时得到结果,但当您让它运行时无穷大,我怀疑您在不到 1 毫秒的时间内下载它,因此您除以 0。您可以尝试使用更大的文件,看看是否可以在没有断点的情况下获得更好的结果。或者考虑一些像DateTime.Ticks这样精确的东西。
请注意,string.length 将是字节而不是位。