C# I';我试图获得ftp下载文件的速度,但有时我';我变得无限了为什么?
这是计算下载速度的方法:C# I';我试图获得ftp下载文件的速度,但有时我';我变得无限了为什么?,c#,.net,winforms,ftp,C#,.net,Winforms,Ftp,这是计算下载速度的方法: private void CalculateDownload(int ln, BackgroundWorker backw) { string speed; DateTime DownloadStart = DateTime.Now; int dnsize = ln; if (dnsize > 0) { DateTime DownloadEnd = DateTime.Now; TimeSp
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;
}
CalculatedDownload方法中的第一个文件下载我得到了文件大小:
例如,变量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);
}
}
为什么当我使用断点时,它会显示下载时间的每一个文件,但如果没有断点,它会显示无穷大?当使用浮点或双精度运算时,除以0会显示无穷大 您可以添加额外的检查,以查看是否已过0毫秒 在这种情况下,不要计算值。时间=0,因为未下载任何内容 然而,该值可能对用户没有用处 您还可以通过传递一个类来添加单元测试,该类实现了一个具有右键的接口 模拟调用back.ReportProgress的方法,例如:
private void CalculateDownload(int ln, IBackgroundWorker backw)
计算时间=0、时间=1时发生的情况,依此类推
最后一句话:
int dnsize = ln;
由于已将变量传递给函数,因此该函数不可用当使用浮点或双精度运算时,除以0将显示无穷大 您可以添加额外的检查,以查看是否已过0毫秒 在这种情况下,不要计算值。时间=0,因为未下载任何内容 然而,该值可能对用户没有用处 您还可以通过传递一个类来添加单元测试,该类实现了一个具有右键的接口 模拟调用back.ReportProgress的方法,例如:
private void CalculateDownload(int ln, IBackgroundWorker backw)
计算时间=0、时间=1时发生的情况,依此类推
最后一句话:
int dnsize = ln;
如果在使用断点时得到一个结果,但在运行断点时得到无穷大,则我怀疑您在不到1ms的时间内下载了它,因此除以0。您可以尝试使用更大的文件,以查看是否在没有断点的情况下获得更好的结果。另一种方法是考虑一些像时间一样精确的东西。蜱。< /P>
注意,string.length将是字节而不是位。如果在使用断点时得到一个结果,但在运行断点时得到无穷大的结果,我怀疑您在不到1ms的时间内下载了它,因此您将除以0。您可以尝试使用更大的文件,以查看是否在没有断点的情况下获得更好的结果。另一种方法是考虑一些像时间一样精确的东西。蜱。< /P>
注意,string.length将是字节而不是位。如果
DownloadSub.totalmillished
为0,您将得到一个0的除法。您正在下载的文件有多大,从哪里获取?是否在下载结束时调用一次测量下载速度的函数?因为您的大小来自string.length,这将使其成为字节/秒,而不是比特/秒。请将DownloadStart
设置在FtpDownload方法开头附近的某个位置。kennyzx很好,谢谢。如果DownloadSub.totalmillis秒
为0,你将得到一个0的除法。你下载的文件有多大?你从哪里获得这些文件?是否在下载结束时调用一次测量下载速度的函数?因为您的大小来自string.length,这将使其成为字节/秒,而不是比特/秒。setDownloadStart
位于FtpDownload method.kennyzx的开头附近。谢谢。我在行速度=string.Format…之前添加了一个检查:if(DownloadSub.totalmillises!=0),但它始终是0。而且开始时间和结束时间是相同的。不确定发生了什么。是的,它们是相同的,因为您总是重新初始化DownloadStart变量。从这到你的计算之间的时间可能是纳秒而不是毫秒。您需要在CalculatedDownload方法外部初始化变量,并将其保留为类成员,以便可以在CalculatedDownload方法内部引用它。此外,您可能需要检查以正确计算时间跨度。我没有访问visual studio atm的权限,因此无法为您检查计算方法是否正确。您有权将下载从方法之外开始。现在它开始工作了。为了计算时间跨度,我将尝试看看我是否理解如何在链接中正确地执行它。谢谢。我在行speed=string.Format之前添加了一个检查……这个检查:if(DownloadSub.totalmillizes!=0),但它始终是0。而且开始时间和结束时间是相同的。不确定发生了什么。是的,它们是相同的,因为您总是重新初始化DownloadStart变量。从这到你的计算之间的时间可能是纳秒而不是毫秒。您需要在CalculatedDownload方法外部初始化变量,并将其保留为类成员,以便可以在CalculatedDownload方法内部引用它。此外,您可能需要检查以正确计算时间跨度。我没有访问visual studio atm的权限,因此无法为您检查计算方法是否正确。您有权将下载从方法之外开始。现在它开始工作了。为了计算时间跨度,我将尝试看看我是否理解如何在链接中正确地执行它。非常感谢。