Você notou que normalmente não há estimativas nos primeiros segundos?
Isso porque nos primeiros segundos ele apenas faz a operação necessária. Então, depois de um (pequeno) while, ele sabe quanto já copiou / apagou / etc , e quanto tempo levou . Isso fornece a velocidade média da operação.
Em seguida, divida os bytes restantes pela velocidade e você terá o tempo necessário para concluir a operação.
Isto é matemática da escola primária. Se você deseja viajar 360 km e, no final do primeiro minuto, percorrer 1 km, quanto tempo levará para chegar ao seu destino?
Bem, a velocidade é de 1 km / minuto. Isso é 60 km / h. 360 km divididos por 60 km / h dá-lhe 6 horas (ou 360 km / 1 km / minuto = 360 minutos = 6 horas). Como você já viajou por um minuto, o tempo estimado restante é de 5 horas e 59 minutos.
Substitua "viagem" por "copiar" e "km" por "bytes" e essa é a sua pergunta.
Diferentes sistemas têm maneiras diferentes de estimar o tempo. Você pode aproveitar o último minuto, e as estimativas podem variar muito, ou você pode aproveitar o tempo todo, e se a velocidade realmente mudar permanentemente, suas estimativas podem estar muito longe da realidade. O que eu descrevi é o método mais simples.