Lister des fichiers dans une zone de liste ! [Résolu]

Signaler
Messages postés
48
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
4 février 2010
-
Messages postés
48
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
4 février 2010
-
Bonjour a tous,

voila je suis en stage et je dois développer une appli en c#, le soucis est que je ne connais pas ce langage :/

En cherchant sur le net j'ai réussi a lister des fichiers contenu dans un répertoire :

DirectoryInfo monrepertoire = new DirectoryInfo("C:\...");
FileInfo[] mesfichiers = monrepertoire.GetFiles("*.log");

Et maintenant je voudrai inscrire le nom des fichiers contenu dans "mesfichiers" dans une zone de liste, pour cela j'ai essayer :

int filecount = mesfichiers.GetUpperBound(0) + 1;
for (int i = 0; i < filecount; i++)
{
listBox2_2.Items.Add(mesfichiers);
}

mais il ne m'affiche pas correctement le nom des fichiers, il m'affiche "tableau de FileInfo[]"

Si quelqu'un a une idée, merci d'avance !

49 réponses

Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
36
Reprenons le code krimog en première page et ajoutons ce qui manque :
StreamReader sr = new StreamReader("MonFichier.log");
List<string> listeErreurs = new List<string>();

string ligne;
int lineNumber = 0;
while((ligne = sr.ReadLine) != null)
{
    lineNumber++;
    if(ligne.StartsWith("error"))
    {
        listeErreurs.Add(string.Format("{0}\t{1}",lineNumber, ligne));
    }
}

sr.Close();


puis... ensuite tu copies le resultat dans ta textbox

maRichTextBox.Text = string.Join('\n', listErreur.ToArray()); 


Sébastien FERRAND
Lead Developpeur
Microsoft Visual C# MVP 2005 - 2009
Messages postés
48
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
4 février 2010

alors j'ai essayer et sa ne fonctionne pas tout d'abord il m'affiche 0 sur toutes les lignes et de plus j'utilise l'autre solution pour remplir ma richTextBox a savoir :

foreach (string erreur in listeErreurs) // on lit chaque valeur de listeErreurs et on l'enregistre dans une variable nommée erreur
{
richTextBox1.Text = richTextBox1.Text + erreur + "\n";
}

en essayant avec ta solution il m'indique une erreur au niveau du toArray, peut etre que je n'ai pas ajouter le using necessaire s'il y en as un a ajouter !
Messages postés
48
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
4 février 2010

au niveau du join plutot, il me dit que la méthode join possède des arguments non valide !
Messages postés
48
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
4 février 2010

J'ai une derniere petite question. Désormais les numéro des lignes s'affichent correctement, et ce que je voudrai c'est afficher le texte situé entre telle ligne et telle ligne. Est-ce possible? Comment est-ce que je dois procéder?

Merci d'avance !
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
44
Pour cette fois, je préfère ne pas te donner le code, mais juste des axes de réflexion :

sr.ReadLine() lit une ligne complète et avance le "curseur" à la ligne suivante. Elle renvoie null s'il n'y a pas de ligne.

for(int i = 0; i < nb; i++) { } effectue une boucle nb fois exactement.

Si tu veux lire de telle ligne à telle ligne, tu sais qu'il faut de déplacer tant de fois à la ligne suivante, puis lire tant de fois une ligne. Donc avec les informations ci-dessus, tu dois pouvoir faire ça.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Messages postés
48
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
4 février 2010

Voici ce que j'ai essayer :

StreamReader sr2 = new StreamReader("G:\\Stage\\logs_vm\\Logs\" + va);
            List<string> listeLigne = new List<string>();
            string ligne;
            string var1 = textBox1.Text;
            string var2 = textBox2.Text;
            int var1_1 = Int32.Parse(var1);
            int var1_2 = Int32.Parse(var2);
            int lineNumber = 0;

            while ((ligne = sr2.ReadLine()) != null)
            {
                lineNumber++;
                if (lineNumber == var1_1)
                {
                    for (lineNumber = var1_1; lineNumber < var1_2; lineNumber++)
                    {
                        listeLigne.Add(string.Format("{0}\t{1}", lineNumber, ligne));
                    }

                    foreach (string erreur in listeLigne) // on lit chaque valeur de listeErreurs et on l'enregistre dans une variable nommée erreur
                    {
                        richTextBox1.Text = richTextBox1.Text + erreur + "\n";
                        // \n est le caractère de retour à la ligne
                    }
                }


dans la boucle for, il ne bouge pas de ligne, il reste sur la meme :/ pourtant la syntaxe me semble bonne !
Messages postés
48
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
4 février 2010

le contenu de la variable "ligne" reste la meme
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
44
C'est normal. Le code qui le fait changer de ligne, comme indiqué dans mon précédent message, est sr.ReadLine()

Ton code a 3 problèmes :
- une boucle en trop
- la méthode ReadLine au mauvais endroit
- tu lis le bon nombre de ligne (si la dernière ligne est exclue), mais tu ne te places pas au bon endroit

En gros, je résume (si tu veux lire de la ligne a à la ligne b) :
- Tu te déplaces de a-1 ligne
- Tu lis b-a (+1 si b inclus) lignes et ajoute les messages d'erreur
- Tu affiches tes erreurs


Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Messages postés
48
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
4 février 2010

j'ai beau essayer de comprendre je ne trouve pas l'erreur :x
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
44
Ton code, avec MES commentaires pour expliquer ce qu'il se passe

    StreamReader sr2 = new StreamReader("G:\\Stage\\logs_vm\\Logs\" + va); // On crée le lecteur
    List<string> listeLigne = new List<string>(); // On crée une liste
    string ligne; // On crée une variable qui contiendra le texte de la ligne
    string var1 = textBox1.Text;
    string var2 = textBox2.Text;
    int var1_1 = Int32.Parse(var1); // on récupère sous forme d'entier le texte entré dans textBox1
    int var1_2 = Int32.Parse(var2);
    int lineNumber = 0; // On crée une variable contenant le numéro de la ligne en cours

    while ((ligne = sr2.ReadLine()) != null)
    /*
     * On commence une boucle. On lit une ligne. On enregistre cette ligne
     * dans la variable ligne. On déplace le curseur à la ligne suivante.
     * On va recommencer la boucle tant qu'une nouvelle ligne existe.
     */
    {
        lineNumber++; // On augmente le numéro de ligne pour avoir la ligne actuelle
        if (lineNumber == var1_1) // Si on est sur la première ligne que l'on souhaite enregistrer
        {
            for (lineNumber = var1_1; lineNumber < var1_2; lineNumber++)
            {
                listeLigne.Add(string.Format("{0}\t{1}", lineNumber, ligne));
                /* 
                 * On ajoute var1_2 - var1_1 fois le numéro de la ligne
                 * (qui augmente à chaque fois), suivi d'une tabulation,
                 * et de la valeur de la variable ligne (qui ne change
                 * qu'à chaque itération de la boucle while).
                 *
                 * De plus, dès la deuxième itération de la boucle,
                 * lineNumber ne correspond plus au texte de ligne.
                 */
            }

            foreach (string erreur in listeLigne)
            {
                richTextBox1.Text = richTextBox1.Text + erreur + "\n";
                // On écrit chaque erreur dans la richTextBox1
            }
        }
    }


Tout d'abord, ton foreach qui sert à afficher les erreurs se trouve lui-même dans une boucle while !
Egalement, tu ajoutes la valeur de "ligne" dans ta liste plusieurs fois (via un for) sans en changer la valeur.

Je te donne encore qqes piste pour avancer :
- Ton foreach ne doit pas se trouver dans une boucle.
- Tu auras soit besoin de ton while et d'un if soit de deux for NON IMBRIQUES

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Messages postés
48
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
4 février 2010

J'ai une solution qui fonctionne !!! c'est peut-etre pas la meilleur mais bon :

while ((ligne = sr2.ReadLine()) != null)
            {
                lineNumber++;
                if (lineNumber >= var1_1)
                {  
                    if (lineNumber <= var1_2)
                    {
                        listeLigne.Add(string.Format("{0}\t{1}", lineNumber, ligne));
                    }

                }
            }

            foreach (string erreur in listeLigne) // on lit chaque valeur de listeErreurs et on l'enregistre dans une variable nommée erreur
            {
                richTextBox1.Text = richTextBox1.Text + erreur + "\n";
                // \n est le caractère de retour à la ligne
            }
            sr2.Close();


Voila et sinon tu pourrais me montrer ce que j'aurai du modifier pour utiliser le For ?

Merci beaucoup pour votre aide !!!!
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
44
Juste une petite remarque à propos de ton code : plutôt que de faire 2 if, tu peux faire

if (lineNumber >= var1_1 && lineNumber <= var1_2)

Méthode avec for :

// On passe les premières lignes
int lineNumber;
for (lineNumber = 1; lineNumber < var1_1; lineNumber++)
{
    sr2.ReadLine();
}

// Avec les ReadLine() que l'on a fait, on sait qu'il faut lire à partir de la prochaine ligne
for (lineNumber = var1_1; lineNumber <= var1_2; lineNumber++)
{
    string ligne = sr2.ReadLine();
    listeLigne.Add(string.Format("{0}\t{1}", lineNumber, ligne);
}

foreach (string erreur in listeLigne)
{
    richTextBox1.Text = richTextBox1.Text + erreur + "\n";
}
sr2.Close();

// !!!!!! ATTENTION !!!!!!
// Avec cette méthode, je ne vérifie pas s'il y a encore des lignes
// dans le fichier (contrairement à la tienne). S'il y a moins de lignes
// que prévu, ma méthode va générer une exception.


Méthode avec for qui ne génèrera pas d'exception :

// On passe les premières lignes
int lineNumber;
string ligne;
for (lineNumber 1; lineNumber < var1_1 && (ligne sr2.ReadLine()) != null; lineNumber++) { }

// Avec les ReadLine() que l'on a fait, on sait qu'il faut lire à partir de la prochaine ligne

for (lineNumber = var1_1; lineNumber <= var1_2 && ligne != null && (ligne = sr2.ReadLine()) != null; lineNumber++)
{
    listeLigne.Add(string.Format("{0}\t{1}", lineNumber, ligne);
}

foreach (string erreur in listeLigne)
{
    richTextBox1.Text = richTextBox1.Text + erreur + "\n";
}
sr2.Close();


La différence est que dans ce cas, les conditions pour rester dans la boucle for incluent le fait que le fichier doit encore posséder des lignes.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Messages postés
48
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
4 février 2010

ok je vais donc modifier mon code pour éviter les if imbriqué. Je savais qu'il était possible de le faire mais je ne trouvé pas la syntaxe correcte :/ . Sinon avec mon code y'a t-il des exception a gérer?

Merci en tout cas pour ton aide qui ma était bien précieuse et qui ma permis d'apprendre pas mal de chose !!!!!
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
44
Avec ton code, il ne devrait pas y avoir d'exception générée.
Sauf, peut-être si le fichier est supprimé au cours de l'exécution (dans ce cas, je ne connais pas le comportement de ReadLine() (Exception ou null)).

Il y a également toujours la possibilité d'une OutOfMemoryException, mais ça c'est tout de même rare.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Messages postés
48
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
4 février 2010

Re bonjour,

Je suis sur un autre problème,

J'ai créer un tableau de "Label" :

private void EnableMenu(Label a)
        {
            Hashtable Tab = new Hashtable();
            Tab.Add("1", menu1);
            Tab.Add("2", menu2);
            Tab.Add("3", menu3);
            Tab.Add("4", menu4);
            Tab.Add("5", menu5);
            Tab.Add("6", menu6);
            Tab.Add("7", menu7);
            Tab.Add("8", menu8);
            Tab.Add("9", menu9);
            Tab.Add("10", menu10);
            Tab.Add("11", menu11);
            Tab.Add("12", menu12);
            Tab.Add("13", menu13);
            Tab.Add("14", menu14);


Suite a cela je voudrai dire si menu1.Text =="-" alors tous les autres menu.Text = "+".
Donc je commence comme ca :

foreach (DictionaryEntry DE in Tab)
            {
                if a.Text == "-"
                {
                   // Tous les autres menu.Text ="+"                   
                }
            }


mais je ne trouve pas ce qu'il faut mettre dans le if :/ si quelqu'un a une idée !
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
44
Tout d'abord, il vaut mieux mettre ton if à l'extérieur du foreach.
Ensuite, ta HashTable contient des Label, autant directement caster en tant que tel dans le foreach.

if (a.Text == "-")
{
    foreach (Label l in Tab)
    {
        if (a != l)
        {
            l.Text = "+";
        }
    }
}


Cependant, pourquoi utilises-tu une table de hashage si y mets comme clé 1, 2, 3, 4... ?
Autant utiliser un tableau ou une liste. Ce sera beaucoup plus rapide et ça prendra moins de mémoire (surtout un tableau).

Tableau :

Label[] Tab = new Label[14];
Tab[0] = menu1;
Tab[1] = menu2;
Tab[2] = menu3;
//...
Tab[13] = menu14;


Liste :

List<Label> Tab = new List<Label>();
Tab.Add(menu1);
Tab.Add(menu2);
Tab.Add(menu3);
//...
Tab.Add(menu14);



et dans les 2 cas, tu peux utiliser
Tab[i]
pour arriver au menu i+1 (car les indices commencent à 0 en C#).
(et tu peux aussi utiliser un foreach)

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Messages postés
48
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
4 février 2010

Merci encore une fois krimog. J'ai décider d'utiliser un tableau et le traitement foreach fonctionne .
Messages postés
48
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
4 février 2010

J'ai une autre petite question comment fonctionne un fichier "app.config" j'ai vu que par exemple on pouvait y intégré des variables en dur ce qui éviterai de devoir recompiler le code aprés le changement de la variable.
Comment peut-on faire cela?
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
36
vto59 : je te conseille d'ouvrir un nouveau thread si tu souhaites poser une autre question.


Sébastien FERRAND
Lead Developpeur
Microsoft Visual C# MVP 2005 - 2009
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
44
Pour être précis, je te conseille d'abord de faire quelques recherches sur internet. Il existe des tutos très clairs pour expliquer le fonctionnement des app.config

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -