Calculer le temps restant dans une copie de fichiers [Résolu]

Siteauludo 60 Messages postés mercredi 25 mai 2005Date d'inscription 15 mai 2007 Dernière intervention - 19 déc. 2006 à 13:10 - Dernière réponse : Siteauludo 60 Messages postés mercredi 25 mai 2005Date d'inscription 15 mai 2007 Dernière intervention
- 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é.
Afficher la suite 

6 réponses

Répondre au sujet
SharpMao 1025 Messages postés mardi 4 février 2003Date d'inscription 7 juin 2010 Dernière intervention - 27 déc. 2006 à 09:13
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de SharpMao
cs_fcolo 201 Messages postés mercredi 8 février 2006Date d'inscription 20 février 2007 Dernière intervention - 19 déc. 2006 à 14:07
0
Utile
Je pense à un tableau (tampon) dans lequel tu sauvegardes les x dernières mesures.
Pour l'affichage, tu indiques la moyenne des mesures du tableau.

Tu conserve juste l'index en cours du tableau, que tu incrémente à chaque nouvelle mesure. Dès que tu atteint la fin du tableau, tu reparts au début.

A toi de faire varier la taille du tableau pour trouver une version assez stable (pas assez de points implique des changements brutaux et trop de points fera pas assez varier la moyenne).

f.colo
Commenter la réponse de cs_fcolo
SharpMao 1025 Messages postés mardi 4 février 2003Date d'inscription 7 juin 2010 Dernière intervention - 19 déc. 2006 à 16:16
0
Utile
Hello,

Est-ce que tu peux nous mettre le bout de code ou tu fait le calcul, car si tu as -3s, ça veut dire qu'une des valeurs est négatives, et je ne vois pas comment ça peut arriver.

Amicalement, SharpMao
Commenter la réponse de SharpMao
Siteauludo 60 Messages postés mercredi 25 mai 2005Date d'inscription 15 mai 2007 Dernière intervention - 20 déc. 2006 à 21:34
0
Utile
Bonjour,

tout d'abort, merci pour vos réponses, mais pour répondre à SharpMao, non, je n'ai pas le code, car vu qu'il ne marchait pas je l'ai supprimé, et maintenant que j'ai fini mon projet je souhaiterai le réajouter.

Mais le code était simple,

Je calculais le temps nécessaire à la copie

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

D1 = Datetime.Now.TimeOfDay;
File.Copy(x, y);
D2 = Datetime.Now.TimeOfDay;

TempsFichier = D2 - D1;

TempsRestant = (TempsFichier / TailleFichierEnOctets) * TailleTotalBackupEnOctets;

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Voilà, en gros c'était ça.

J'ai aussi essayé avec les DateTime.Now.Ticks, mais impossible de trouver comment les reconvertir en secondes.

Merci,

Siteauludo
Commenter la réponse de Siteauludo
Siteauludo 60 Messages postés mercredi 25 mai 2005Date d'inscription 15 mai 2007 Dernière intervention - 22 déc. 2006 à 12:56
0
Utile
Personne ne peut me dire si le code est bon ?

Siteauludo
Commenter la réponse de Siteauludo
Siteauludo 60 Messages postés mercredi 25 mai 2005Date d'inscription 15 mai 2007 Dernière intervention - 27 déc. 2006 à 18:51
0
Utile
Merci beaucoup !

Désolé d'avance, je ne peux pas tester ça immédiatement, j'ai du désinstaller visual studio, et je ne pourrais pas l'installer avant plusieurs jours, mais ce code me paraît très bien !

Je posterai les résultats ici, au cas où d'autres personnes auraient le même problème que moi.

Encore merci,

Siteauludo
Commenter la réponse de Siteauludo

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.