受此启发xckd动画片我不知道什么是提供一个估计将文件复制/移动的用户的最佳机制?
XKCD上的ALT标签内容如下:
他们可能会说“的连接可能丢失,”但它更有趣的事情天真的时间平均给你希望,如果你在附近等1163小时,这将最终完成。
忽略搞笑,真的是它如何在Windows中完成? 怎么样其他的操作系统? 有没有更好的办法?
受此启发xckd动画片我不知道什么是提供一个估计将文件复制/移动的用户的最佳机制?
XKCD上的ALT标签内容如下:
他们可能会说“的连接可能丢失,”但它更有趣的事情天真的时间平均给你希望,如果你在附近等1163小时,这将最终完成。
忽略搞笑,真的是它如何在Windows中完成? 怎么样其他的操作系统? 有没有更好的办法?
看看我的回答类似的问题上的剩余时间是如何在Windows资源管理器估计(和其他答案有)。
在我看来,只有得到良好的估算方法之一:
需要注意的是第一点,可能需要相当长的一段工作中,如果你要复制多个文件。 这也许就是为什么从微软的家伙决定去无它。 你需要决定自己是否通过计算产生的额外开销是值得给予用户更好的估计。
我对我所做的估计时,队列将是空的类似的东西,因为项目被出队的速度比他们正在排队。 我用线性回归以上(时间,队列大小)的最近的n个读数。
这使其比幼稚更好的结果
(bytes_copied_so_far / elapsed_time) * bytes_left_to_copy
elapsedTime
” totalCopied
” totalCopied
通过totalElapsed
,得到每定时器间隔复制的字节(在此情况下,1000毫秒)的数目。 让我们把这个变量“ bytesPerSec
” bytesPerSec
,将获得的理论上需要复制此文件的总秒数。 让我们把这个变量remainingTime
elapsedTime
从remainingTime
和你的文件拷贝时间有点精确计算。 我认为对话应该只承认自己的局限性。 这不是烦人,因为它的失败给一个有用的时间估计,这很烦人,因为它的权威性提供了一个估计这是显而易见的废话。
然而所以,估计你喜欢的,基于当前率或平均速率到目前为止,滚动平均值放弃局外点,或什么的。 取决于操作和延缓其事件的典型持续时间,所以你可能有不同的算法时,你知道该文件的副本包括网络驱动器。 但是,直到你估计已经有一段时间等于30秒的估计时间的10%,显示较小的相当一致:“哦,亲爱的,似乎有某种滞留”时,它的大规模放缓,或只是忽略它,如果它的大规模加快。
例如,以1秒间隔进行对话消息当连接简要档:
remaining: 60 seconds // estimate is 60 seconds
remaining: 59 seconds // estimate is 59 seconds
remaining: delayed [was 59 seconds] // estimate is 12 hours
remaining: delayed [was 59 seconds] // estimate is infinity
remaining: delayed [was 59 seconds] // got data: estimate is 59 seconds
// six seconds later
remaining: 53 seconds // estimate is 53 seconds
最重要的是我将永远不会显示秒(仅适用于小时和分钟)。 我认为,当你坐在那里,等待一分钟,而计时器跳到10到20秒之间这真是令人沮丧。 始终显示像真正的信息:复制XXX / YYYY MB。
我也包括这样的事情:
if timeLeft > 5h --> Inform user that this might not work properly if timeLeft > 10h --> Inform user that there might be better ways to move the file if timeLeft > 24h --> Abort and check for problems
我还要告知用户如果估计的时间而变化太多
如果这不是太复杂,应该有一个自动检查功能来检查,如果该进程仍然活着,并且工作正常每隔1-10分钟(取决于应用程序)。
谈到网络文件副本,最好的办法是计算文件的大小要传输,网络响应等,我曾经曾经是一个方法:
连接速度=中国平安和计算往返时间,包15个字节。
让我的文件大小和看到,theorically,如果我会用我的连接速度打破它在15个kb的包需要多少时间服用。
重新计算我的连接速度传输开始后ajust将被spended的时间。
我一直在琢磨这一个自己。 我有一个副本常规 - 通过Windows资源管理器风格的界面 - 这使得选择的文件从Android设备转移,到PC。
在开始时,我知道这是要复制的文件(S)的总大小,因为我使用C#.NET,我使用的是秒表,让经过的时间,并且在复制过程中,我保持共到目前为止什么被复制,以字节为单位。
我没有实际测试过,但最好的办法似乎是这样的 -
估计=经过*((总计TOTALSIZE - copiedSoFar)/ copiedSoFar)