Récupérer l'unité de plusieurs fichiers [Résolu]

Signaler
Messages postés
83
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
8 juillet 2008
-
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
-
Bonsoir à tous, j'ai un listView et un bouton pour ouvrir plusieur fichier et sur ce bouton j'ai mis ce code :

            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                string[] files = openFileDialog.FileNames;

                foreach (string file in files)
                {
                    FileInfo fi = new FileInfo(file);
                    string strTampon = fi.Length.ToString();
                    float fltTailleAffichable = 0;
                    ListViewItem item = new ListViewItem(fi.Name);
                    if (strTampon.Length >= 1024)
                    {
                        fltTailleAffichable = fi.Length / 1024;
                    }
                    else if ( strTampon.Length >= 1048576)
                    {
                        fltTailleAffichable = fi.Length / 1048576;
                    }
                   
                    item.SubItems.Add(fltTailleAffichable.ToString());
                    lstMusique.Items.Add(item);
                }
            }

Le probème c'est que je récupère 0 comme valeur pour la taille, ou est le problème ? est ce facile a corriger ?

12 réponses

Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
50
Salut,

Regarde tes conditions if. Tu est en train de récuperer la longeur de la chaine qui contient la taille de ton fichier.
En bref, si la taille de ton fichier est '10245', la valeur de la propriété strTampon.Length est 5 (5 caracteres)...
Changes ta confition if par (fi.Length >= 1024), ...

Autre petit souci, si la valeur est plus grande que 1024, tu ne rentreras jamais dans ta seconde condition...(si la taille est plus grande que 1048576, elle est forcément plus grande que 1024). Inverses les 

Mx
MVP C# 
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
50
Le resultat d'une division par un entier est un entier.
Si tu veux que ton resultat soit un float, divise par (float)1024, ou 1024f (façon plus élégante de l'écrire)
Mx
MVP C# 
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
50
Tu mets une variable de type long en dehors de ta boucle, apres la déclaration de ton tableau "files" par exemple

long total = 0;

et dans ta boucle :

total += fi.Length ;
Mx
MVP C# 
Messages postés
83
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
8 juillet 2008

Je te remercie sa fonctionne par contre je récupère des fichier de 6Mo par exemple sans chiffre après la virgule, comment ca se fait ? j'en voudrais au moins deux ^^
Messages postés
83
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
8 juillet 2008

Et ca ne marche pas car un fichier qui fait 8 Ko il me met 8 aussi...
Messages postés
83
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
8 juillet 2008

Merci ^^ j'ai réctifié :

            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                string[] files = openFileDialog.FileNames;

                foreach (string file in files)
                {
                    FileInfo fi = new FileInfo(file);
                    string fileWExt = Path.GetFileNameWithoutExtension(fi.Name);
                    float fltTailleAffichable = 0;
                    ListViewItem item = new ListViewItem(fileWExt);
                    if ( fi.Length >= 1048576)
                    {
                        fltTailleAffichable = fi.Length / 1048576f;
                    }
                    else if (fi.Length >= 1024)
                    {
                        fltTailleAffichable = fi.Length / 1024f;
                    }

                    item.SubItems.Add(fltTailleAffichable.ToString("0.00"));
                    lstMusique.Items.Add(item);
                }
            }
Messages postés
83
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
8 juillet 2008

Et comment je peux récupérer la taille total de tout les fichier ouvert ?
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
50
En faisant une addition de tous les FileInfo.Length récupérés dans ton foreach ?

Mx
MVP C# 
Messages postés
83
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
8 juillet 2008

Ouais mais comment s'y prendre ?
Messages postés
83
Date d'inscription
vendredi 17 juin 2005
Statut
Membre
Dernière intervention
8 juillet 2008

Merci marche impec ^^
//Hors de la boucle
 long total = 0;
//dans la boucle
total += fi.Length / 1048576L;

//apres la boucle
lblTotal.Text = "Total : " + total.ToString("0.00");

Mais toujours ptit souci d'arrondi, bah ca n'arrondi pas lol

5.82 et 5.83 il arrondi à 10
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
7
total est de type long, donc un entier, donc ToString("0.00") renvera toujours quelque chose de la forme de
"xxxx.00"
Ce qui n'est pas ce que tu cherche je présume.
Je pense que tu voudrais plutot faire :

 long total = 0;
//dans la boucle
total += fi.Length;

//apres la boucle
lblTotal.Text = "Total : " + (total / (1024f * 1024f)).ToString("0.00 Mo");

<hr size="2" width="100%" />Julien.
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
7
En fait, pour expliquer l'erreur entre 5.83 et 10 qui est quand même plus grande qu'une simple erreur d'arrondi, il faut un petit peu analyser ton algorithme pour se rendre compte qu'il contient une grande faiblesse :

Lorsque tu fais :
total += fi.Length / 1048576L

total est incrémenté de la division entière de fi.Length par 1024^2, ce qui signifie que la partie décimale de la vraie réponse est tronquée. Sur N itérations, tu fais donc une erreur de au plus N.
Ce qui est très ennuyeux par rapport à d'autres algorithmes avec une majoration d'erreur semblable, c'est qu'elle porte toujours le même signe, en effet la division entière sera toujours plus petite ou égale à la division réelle. Tu auras donc toujours une erreur relativement importante, ce qui explique la différence entre 5.84 et 10.

Par contre avec la modification que je te propose, total est parfaitement exact jusqu'à la fin de l'algorithme, et ce n'est qu'à la division lors de l'affichage qu'un arrondi est fait.

Tout ce bla-bla pour dire qu'il est important de regarder ce que l'on fait et comme quoi deux algorithmes à priori très semblables peuvent donner des réponses très différentes...

<hr size ="2" width="100%" />Julien.