IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Problème de foreach sur getFiles()


Sujet :

C#

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2010
    Messages : 22
    Par défaut Problème de foreach sur getFiles()
    Bonjour,
    actuellement j'ai ceci qui fonctionne correctement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    foreach (FileInfo nextImage in dirRoot.GetFiles())
    {
         if (BoiteAOutils.isImage(nextImage.Extension))
         {
               addImage(path + @"\" + nextImage.Name, newnode);
         }
    }
    Et lorsque je rajoute ce code a la fonction addImage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    if(System.IO.File.Exists(pathImage))
    {
           Bitmap img = new Bitmap(pathImage);
           int ratio;
           if (img.Width < img.Height)
                 ratio = img.Height / 60;
           else if (img.Height < img.Width)
                 ratio = img.Width / 60;
           else
                 ratio = 1;
           Bitmap image = new Bitmap(img, new Size(60, 60));
           image.Save(pathDossDest+@"\"+Path.GetFileName(pathImage));
           img.Dispose();
           image.Dispose();
     }
    Dans mon nextImage, s'ajoute les noms des fichiers en allant c est a dire :
    premier passage : nextFile.name=fichier1.jpg
    second : nextFile.name=fichier1.jpg.fichier2.jpg
    troisisieme : nextFile.name=fichier1.jpg.fichier2.jpg.fichier3.jpg
    .... ainsi de suite.
    Je ne vois vraiment pas en quoi un code appelant peut poser soucis dans le code appelant.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    A mon avis le problème ne se trouve pas dans le code que tu as posté... en tous cas je ne trouve rien qui puisse expliquer ça. Montre un extrait de code plus complet.

  3. #3
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach (FileInfo nextImage in dirRoot.GetFiles())
    A ma connaissance, ça va évaluer GetFiles() à chaque itération, non ?

    Donc vu qu'on ajoute des fichiers à chaque itération, on arrive dans une boucle infinie, et on rempli le disque...

    Moi je fais toujours :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FileInfo [] files = dirRoot.GetFiles();
    foreach (FileInfo nextImage in files)

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    A ma connaissance, ça va évaluer GetFiles() à chaque itération, non ?
    Non, le foreach est transformé par le compilateur en quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    using (IEnumerator<FileInfo> enumerator = GetFiles().GetEnumerator())
    {
        while(enumerator.MoveNext())
        {
            FileInfo nextImage = enumerator.Current;
     
            // Corps de la boucle foreach
            ...
        }
    }
    GetFiles n'est donc appelé qu'une seule fois.

  5. #5
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    ah ok, bon, ben je m'amuse tout le temps à passer par un array inutile alors

  6. #6
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2010
    Messages : 22
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DirectoryInfo dirRoot = new DirectoryInfo(path);
                try
                {
                    foreach (FileInfo nextImage in dirRoot.GetFiles())
                    {
                        if (BoiteAOutils.isImage(nextImage.Extension))
                        {
                            addImage(path + @"\" + nextImage.Name, newnode);
                        }
                    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public void addImage(string path,XmlNode node)
            {
                XmlNode Nimage = docXml.CreateElement("image");
                XmlNode pathNode = docXml.CreateElement("pathImage");
                XmlText text = docXml.CreateTextNode(path);
                XmlNode pathMiniatureNode = docXml.CreateElement("pathMiniature");
                XmlText textmini = docXml.CreateTextNode(pathMiniatures+"\\"+Path.GetFileName(path));
                pathMiniatureNode.AppendChild(textmini);
                pathNode.AppendChild(text);
                Nimage.AppendChild(pathNode);
                Nimage.AppendChild(pathMiniatureNode);
                node.AppendChild(Nimage);
                BoiteAOutils.addMiniature(path, pathMiniatures);
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public static void addMiniature(string pathImage,string pathDossDest)
            {
                if(System.IO.File.Exists(pathImage))
                {
                    Bitmap img = new Bitmap(pathImage);
                    int ratio;
                    if (img.Width < img.Height)
                        ratio = img.Height / 60;
                    else if (img.Height < img.Width)
                        ratio = img.Width / 60;
                    else
                        ratio = 1;
                    Bitmap image = new Bitmap(img, new Size(60, 60));
                    image.Save(pathDossDest+@"\"+Path.GetFileName(pathImage));
                    img.Dispose();
                    image.Dispose();
                }
            }
    Si je met cette ligne en commentaire : BoiteAOutils.addMiniature(path, pathMiniatures); plus de problème.

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Bah j'ai beau regarder le code sous toutes les coutures, je vois pas... tu as essayé de déboguer en pas à pas ? C'est sans doute la meilleure façon de comprendre ce qui se passe

  8. #8
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2010
    Messages : 22
    Par défaut
    J'ai essayé et dès le foreach (FileInfo nextImage in dirRoot.GetFiles()) en pas a pas,dans mon nextImage, s'ajoute les noms des fichiers en allant c est a dire :
    premier passage : nextFile.name=fichier1.jpg
    second : nextFile.name=fichier1.jpg.fichier2.jpg
    troisisieme : nextFile.name=fichier1.jpg.fichier2.jpg.fichier3.jpg
    .... ainsi de suite.

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    alors là c'est surnaturel
    Essaie de faire juste ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                    foreach (FileInfo nextImage in dirRoot.GetFiles())
                    {
                        Debug.Print(nextImage.Name);
                    }
    Si tu obtiens le même résultat, c'est qu'il y a vraiment un truc qui cloche...

    Ah, et puis une question bête, mais qu'il faut quand même se poser... tu es sûr que tu n'as pas réellement des fichiers avec ces noms dans le répertoire en question ?

  10. #10
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2010
    Messages : 22
    Par défaut
    J'ai essayé en pas a pas en mettant en commentaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BoiteAOutils.addMiniature(path, pathMiniatures);
    et tout est bon. Donc là je ne vois vraiment pas comment c est possible !

  11. #11
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2010
    Messages : 22
    Par défaut
    Mon nextImage dans mon foreach est bon du moment que je met en commentaire : BoiteAOutils.addMiniature(path, pathMiniatures);

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par gobelet18 Voir le message
    Mon nextImage dans mon foreach est bon du moment que je met en commentaire : BoiteAOutils.addMiniature(path, pathMiniatures);
    Bah je sais bien, ça fait 3 fois que tu le dis
    Mais là vraiment je vois pas du tout comment c'est possible... Si tu peux poster un exemple court (pas ton projet entier) mais complet (assez pour reproduire le problème), je jetterai un coup d'oeil

  13. #13
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2010
    Messages : 22
    Par défaut
    J'étais pas sûr que ce soit clair ^^.
    Sinon voilà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    FolderBrowserDialog fbd = new FolderBrowserDialog();
                fbd.ShowDialog();
                string path = fbd.SelectedPath;
                DirectoryInfo dirRoot = new DirectoryInfo(path);
                string pathDossDest = path + "\\miniatures";
                Directory.CreateDirectory(pathDossDest);
                try
                {
                    foreach (FileInfo nextImage in dirRoot.GetFiles())
                    {
                        if (nextImage.Extension == ".jpg" || nextImage.Extension == ".jpeg" || nextImage.Extension == ".png")
                        {
                            Bitmap img = new Bitmap(nextImage.FullName);
                            int ratio;
                            if (img.Width < img.Height)
                                ratio = img.Height / 60;
                            else if (img.Height < img.Width)
                                ratio = img.Width / 60;
                            else
                                ratio = 1;
                            Bitmap image = new Bitmap(img, new Size(60, 60));
                            image.Save(pathDossDest + @"\" + Path.GetFileName(path));
                            img.Dispose();
                            image.Dispose();
                        }
                    }
                }
                catch (UnauthorizedAccessException f)
                {
                    string t = f.ToString();
                }

  14. #14
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Bah il marche très bien ce code

    Mis à part cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    image.Save(pathDossDest + @"\" + Path.GetFileName(path));
    qu'il faut remplacer par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    image.Save(pathDossDest + @"\" + Path.GetFileName(nextImage.Name));
    Aucun problème, ça crée bien une miniature de chaque image...

  15. #15
    Membre Expert
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Par défaut
    Bonsoir,

    Juste quelques petites remarques "optionnelles"
    • Tu n'utilises jamais ratio
    • Tu pourrais remplacer ta concaténation pour le chemin de la miniature par un appel à Path.Combine
    • Il serait peut-être judicieux (point de vue extensibilité) de placer les extensions dans un conteneur (tableau, liste, etc.) et de faire un if (allowedExtensions.Contains(nextImage.Extension))(voire appliquer cela directement sur l'énumération du foreach foreach (FileInfo nextImage in dirRoot.EnumerateFiles().Where(fi => allowedExtensions.Contains(di.Extension)))


    Cordialement !

  16. #16
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2010
    Messages : 22
    Par défaut
    J'ai une fonction isImage(string path) pour gerer, c'est juste que c'était plus simple pour le morceau de code demandé. Le ratio n'était pas utilisé, c'est vrai ^^, c'est corrigé et merci pour la remarque j'avais pas vus. Et efféctivement si je remplace dans mon code par Path.GetFileName(nextImage.Name)); ca marche mieux ^^.
    Et le problème que j'avais était dans mon dossier de test, des images nommé ".image.jpg" et du coup le foreach concaténait plusieurs fichiers a cause de cela. Merci a tous de vos conseils.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [ZF 1.11] problème dojo.date sur onchange dans foreach
    Par yoann92 dans le forum Zend_Form
    Réponses: 2
    Dernier message: 27/09/2012, 12h14
  2. Réponses: 1
    Dernier message: 07/02/2008, 22h40
  3. [CR] Problème de sélection sur un champ date
    Par noluc dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 21/11/2003, 17h56
  4. Problème avec RDTSC sur K6-III
    Par le mage tophinus dans le forum x86 32-bits / 64-bits
    Réponses: 17
    Dernier message: 30/09/2003, 10h43
  5. problème de float sur SQL server 2000.
    Par fidji dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 24/07/2003, 15h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo