如果下载失败或成功,我如何测试文件下载并继续下载直到成功?

Posted

技术标签:

【中文标题】如果下载失败或成功,我如何测试文件下载并继续下载直到成功?【英文标题】:How can I test file download if download failed or success and keep downloading until success? 【发布时间】:2021-12-03 16:36:32 【问题描述】:

第一次下载 TimeDate.Now 时例如是 15:57 所以我 RoundDown 使 15:55 格式化并尝试下载它。

如果在已完成的事件中没有成功,我会尝试从 15:55 到 15:50 再次格式化并再次尝试下载。

问题是它没有再次四舍五入。在完成的事件中,如果有错误这一行:

 current = RoundDown(current, TimeSpan.FromMinutes(-5));

它仍然是上面四舍五入的 15:55,我希望在下载不成功之前保持向下舍入并尝试下载新的 currentLink 与新的向下舍入。 15:50 不成功 make it 15:45 not success 15:40 依此类推,一遍又一遍地构建 currentLink,直到下载成功。

public void GetImages()
        
            defaultlink = "https://IMSRadar/IMSRadar_";

            current = RoundDown(DateTime.Now, TimeSpan.FromMinutes(-5));
            var ct = current.ToString("yyyyMMddHHmm");
            currentLink = defaultlink + ct + ".gif";

            using (System.Net.WebClient wc = new System.Net.WebClient())
            
                wc.DownloadFileCompleted += Wc_DownloadFileCompleted;
                wc.DownloadFileAsync(new Uri(currentLink), @"d:\test.gif");
            
        

        private void Wc_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
        
            if (e.Error != null)
            
                using (System.Net.WebClient wc = new System.Net.WebClient())
                
                    current = RoundDown(current, TimeSpan.FromMinutes(-5));
                    var ct = current.ToString("yyyyMMddHHmm");
                    currentLink = defaultlink + ct + ".gif";
                    wc.DownloadFileCompleted += Wc_DownloadFileCompleted;
                    wc.DownloadFileAsync(new Uri(currentLink), @"d:\test.gif");
                
            
            else
            
                GenerateRadarLinks();
            
        

方法 RoundDown

DateTime RoundDown(DateTime date, TimeSpan interval)
        
            return new DateTime(date.Ticks / interval.Ticks *
                interval.Ticks);
        

【问题讨论】:

我无法理解您的 RoundDown 方法,或者确实需要多次使用它。你为什么不把你的 dateTime 分钟减五,而不是不断地尝试四舍五入到下一个可被 5 整除的数字(这将失败,因为你的输入在第一次之后已经可以被 5 整除,导致没有变化) ?此外,在这种情况下使用 -5 应该没有什么区别,因为 RoundDown 将区间乘以自身,所以 (-5) * (-5) = +25 无论如何 @ShrimpPerator 首先,我每次尝试向下舍入并且不将分钟更改为负 5 的原因是,例如,如果第一次 DateTime.Now 是 13:49,我必须首先将其更改为 13:45,然后我每次可以自己减去 5,但至少第一次我必须将其舍入,因为我需要测试分钟时间的链接必须是 5 或 0,如 14:45 或 13 :30 或 12:20 所以也许我只需要在第一次四舍五入它,然后如果有错误,我自己减去 5 分钟。我会努力做到的。 @ShrimpPerator 尝试多次下载的原因是因为我不知道网站上的工作链接是什么我只知道链接的一部分但不知道日期时间部分是什么关联。这就是为什么我要进行测试,直到找到正确的 currentLink 工作链接。 @ShrimpPerator 我的代码中的内置链接应该是这样的,例如:Radar_202110151650.gif 但因为我还不知道格式化的日期时间是否正确,所以我想保留每次 5 分钟,直到下载没问题,然后我知道这是正确的链接。因此,例如,如果此链接不起作用,则下一个链接应该是:Radar_202110151645.gif,然后是 Radar_202110151640.gif,依此类推,每分钟 5 分钟。这是我需要做的测试才能找到有效的链接。 【参考方案1】:

您的roundDown 在您到达某个日期后将无法使用,该日期已经是 5 分钟的倍数。想象一下:

假设整数除法103 / 5 * 5 将得到20 * 5 因此100 符合预期。但是在下一次迭代中,您拥有100 / 5 * 5 将再次提供100,因为 100 / 5 == 103 / 5 == 20(带整数除法)。

因此,要使其正常工作,您需要将时间减少至少一个刻度,因此它不再是 5 分钟的倍数。

DateTime RoundDown(DateTime date, TimeSpan interval) 
  return new DateTime((date.Ticks - 1)/ interval.Ticks * interval.Ticks);

我个人只会使用一次RoundDown 方法来生成第一个 5 的倍数的时间戳。对于所有后续请求,我只需采用当前时间戳并将其递减 5 分钟。

//inital timestamp
current = RoundDown(DateTime.Now, TimeSpan.FromMinutes(-5));

//in the error handler
current = current.AddMinutes(-5);

【讨论】:

或一轮,然后减少五分钟以提高效率。 @ShrimpPerator 感谢您的评论。这就是我刚刚将我的帖子更新为... 一定是刚刚错过了编辑 :) 顺便说一句。您可以只使用 5 作为 TimeSpan.FromMinutes。反正负数会成倍增加 @ShrimpPerator 对。我刚刚从 OP 的问题中复制了该行

以上是关于如果下载失败或成功,我如何测试文件下载并继续下载直到成功?的主要内容,如果未能解决你的问题,请参考以下文章

火狐浏览器自动下载东西

ubuntu搭建maven失败,而且很奇怪,即是直接到目录中执行mvn也不成功

忽略Gradle构建失败并继续构建脚本吗?

shell 测试URL 是否正常脚本

使用SDWebImage下载图片,sharedDownloader方法下载成功,new 方法下载失败

uboot下tftp下载文件失败的排查步骤