Calculer le temps restant dans une copie de fichiers

Résolu
Siteauludo
Messages postés
60
Date d'inscription
mercredi 25 mai 2005
Statut
Membre
Dernière intervention
15 mai 2007
- 19 déc. 2006 à 13:10
Siteauludo
Messages postés
60
Date d'inscription
mercredi 25 mai 2005
Statut
Membre
Dernière intervention
15 mai 2007
- 27 déc. 2006 à 18:51
Bonjour,

J'ai fait un petit programme de backup et j'ai un léger problème : Je souhaite pouvoir afficher le temps restant  (en gros bien sûr, comme pour les boîtes de dialogues de copie de fichiers de windows xp) avant la fin de la sauvegarde.

En théorie, je calcule très précisément le temps de copie d'un fichier, et je fais :

(Durée / TailleFichier) * TailleTotaleDeLaSauvegarde

ça marche plutôt pas mal, mais bien sûr le temps restant change de manière intempestive (ce qui est normal, car ça dépend de la rapidité des gros fichiers par rapport aux plus petits, de l'occupation actuelle du processeur...). En bref, ça passe de 2943 minutes à -3 secondes sans autres, et ça repart à 3943324 heures...

Es-ce que quelqu'un à une idée pour reproduire le système qui calcule le temps de windows XP ? Il n'est certe pas très constant non plus, mais il est beaucoup plus réalise (il passe de 20 minutes à 15 min, par exemple).

Je suppose qu'il faudrait faire une moyenne, mais j'ai pas encore trouvé comment.

Merci,

Siteauludo

PS : Comme c'est un programme de backup, il peut y avoir des énormes fichiers comme des minuscules, et le tout en grande quantité.

6 réponses

SharpMao
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
67
27 déc. 2006 à 09:13
Hello,

Il y a un défaut à ton calcul, c'est que tu ne tiens compte que du dernier fichier copié. En tenant compte de l'ensemble des fichiers déjà copiés, tu auras une approximation plus précise.

On peut dire que le temps restant est égal au temps effectué multiplié par le rapport entre la taille restante à copier et la taille déjà copiée.

string

[] FileList = Directory
.GetFiles(Path1);
long
lngTotSize = 0;
foreach (string strFile in
FileList)
{
   lngTotSize += newFileInfo
(strFile).Length;
}

DateTime dtStart = DateTime
.Now;
long
lngCopiedSize = 0;

foreach (string strFile in
FileList)
{
   FileInfo fi = newFileInfo
(strFile);
   File.Copy(strFile, Path
.Combine(Path2, fi.Name));
   lngCopiedSize += fi.Length;
   TimeSpan
TimeDone =
DateTime.Now - dtStart;
   
TimeSpan TimeRemaining =
new
TimeSpan((
long)(TimeDone.Ticks * ((
double)(lngTotSize -       lngCopiedSize) / lngCopiedSize))).ToString();

}

Les typecasting et les parenthèses sont très importants, car si on ne convertit pas en double, une fois la moitié passée, le resultat de la division est inférieur à 1, donc 0 pour un type long. Il faut également faire attention, car même si les nombres sont des long (64 bits), si on les multiplie sans précautions, on peut rapidement arriver à des Overflow, et donc des nombres négatifs.

J'espère que je ne me suis pas trompé dans mes calculs, et que ceci pourra t'aider.

Amicalement, SharpMao
3