Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# I';我试图获得ftp下载文件的速度,但有时我';我变得无限了为什么?_C#_.net_Winforms_Ftp - Fatal编程技术网

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,这将使其成为字节/秒,而不是比特/秒。set
DownloadStart
位于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的权限,因此无法为您检查计算方法是否正确。您有权将下载从方法之外开始。现在它开始工作了。为了计算时间跨度,我将尝试看看我是否理解如何在链接中正确地执行它。非常感谢。