[c#] ouverture et affichage de plusieurs fichiers en meme temps !

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,

Ce que je souhaite faire, c'est ouvrir plusieurs fichiers en meme temps et les rassembler en un seul fichier !

J'ai essayer ça :

public void enable()
        {
            int i =0,filecount;
            string va_list;
            filecount = listFichier.Count; // liste de fichier situés dans une listbox du formulaire précédent

            for (i = 0; i < filecount; i++)
            {
                nbligne += nbligne;
                TextReader reader,sr;
                List<string> listligne =new List<string>();
                va_list = listFichier[i];
                string fileName = "G:\\Stage\\logs_vm\\Logs\" + va_list;
                reader = new StreamReader(fileName);
                sr = new StreamReader(fileName);
                string result = reader.ReadToEnd();
                reader.Close();
                richTextBox1.Text = richTextBox1.Text + result;
                
                /* Cette parti ne me sert qu'a compter le nombre de ligne en tout dans tous les fichiers, cela me permet de savoir le nombre de ligne a traiter */

                string ligne;
                while ((ligne = sr.ReadLine()) != null)
                {
                    nbligne++;
                    if (ligne.Contains('\n'))
                    {
                        nbligne++;
                    }
                }
                MessageBox.Show(nbligne.ToString());
            }
        }



Dans ce code j'essaye juste d'ouvrir tous les fichiers et de les afficher les uns a la suite des autres mais je n'y arrive pas :/. Dans ce code seul le dernier fichier lu est affiché dans ma richtextbox.

Mais par la suite je voudrai que tous les fichiers soit rassembler en un seul pour n'avoir qu'un fichier en gros a traiter...

Si quelqu'un a une idée je suis preneur,

Merci d'avance.

16 réponses

Messages postés
268
Date d'inscription
lundi 1 mars 2004
Statut
Membre
Dernière intervention
19 avril 2012
11
Quelque chose d'assez simple :


// Création du fichier qui contiendra tous les fichiers
FileStream fsWrite = new FileStream("C:\\Users\\XXX\\Desktop\\test.txt", FileMode.Create, FileAccess.Write);

// Instance d'écriture        
StreamWriter writer = new StreamWriter(fsWrite);

string result = "";

for (int i = 0; i < listFichier.Count; ++i)
{
    FileStream fsRead = new FileStream("G:\\Stage\\logs_vm\\Logs\" + listFichier[i],
                                       FileMode.Open, FileAccess.Read);
    StreamReader reader = new StreamReader(fsRead);
    result = reader.ReadToEnd();
    reader.Close();
    reader.Dispose();
    fsRead.Close();
    fsRead.Dispose();

    writer.Write(result);

}

writer.Close();
writer.Dispose();

fs.Close();
fs.Dispose();


Et normalement là il n'y a pas de soucis, ça doit marcher
Messages postés
48
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
4 février 2010

Oui c'est bon sa marche nikel. Je te remercie de m'avoir aider !!!

A+
Messages postés
48
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
4 février 2010

Euh finalement il y a un soucie :/

Dans la liste de fichier il peut y avoir 1,2,3 fichiers mais il peut y avoir également 50 fichiers...

Je viens de faire le test avec une liste de 50 fichiers et le programme plante en me disant que l'exception "System.OutOfMemoryException" n'as pas été géré. Que dois-je faire?
Messages postés
268
Date d'inscription
lundi 1 mars 2004
Statut
Membre
Dernière intervention
19 avril 2012
11
Faudrait voir la taille des fichiers.
Essaie aussi de passer reader et fsRead à null après leur méthode Dispose()

Ensuite appelle GC.Collect() pour forcer le garbage collector à vider les instances qui ne sont plus utiliser.

Ca donnerait quelque chose comme ceci :

// Création du fichier qui contiendra tous les fichiers
FileStream fsWrite = new FileStream("C:\\Users\\XXX\\Desktop\\test.txt", FileMode.Create, FileAccess.Write);

// Instance d'écriture        
StreamWriter writer = new StreamWriter(fsWrite);

string result = "";
int index = 0;

for (int i = 0; i < listFichier.Count; ++i)
{
    FileStream fsRead = new FileStream("G:\\Stage\\logs_vm\\Logs\" + listFichier[i],
                                       FileMode.Open, FileAccess.Read);
    StreamReader reader = new StreamReader(fsRead);
    result = reader.ReadToEnd();
    reader.Close();
    reader.Dispose();
    fsRead.Close();
    fsRead.Dispose();

    reader = null;
    fsRead=null;

    index++;

    if(index == 5)
    {
       index = 0;
       GC.Collect();
    }

    writer.Write(result);
}

writer.Close();
writer.Dispose();

fs.Close();
fs.Dispose();
Messages postés
48
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
4 février 2010

Non j'ai toujours ce meme problème et apparemment le problème intervient au niveau de cette ligne :

string resultat = sr1.ReadToEnd();
Messages postés
48
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
4 février 2010

arf j'ai mal lu en fait le problème intervient a la suite de ton code parce que j'ai rajouter un traitement dans la procédure pour que j'ouvre le fichier "test.txt" que je le lise et que je l'affiche a l'écran :

   nbligne += nbligne;
            StreamReader sr1,sr;
            string fileName = "C:\\Log" + va_list + ".txt";
            sr1 = new StreamReader(fileName);
            sr = new StreamReader(fileName);
            string resultat = sr1.ReadToEnd();
                
            richTextBox1.Text = resultat;

            string ligne;
            while ((ligne = sr.ReadLine()) != null)
            {
                nbligne++;
            }
            MessageBox.Show(nbligne.ToString());
            sr1.Close();
            sr.Close();
Messages postés
48
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
4 février 2010

et sinon pour indication les 50 fichiers rassembler en un seul fait 200mo
Messages postés
268
Date d'inscription
lundi 1 mars 2004
Statut
Membre
Dernière intervention
19 avril 2012
11
Evite ce genre de ligne

StreamReader sr1,sr;
            string fileName = "C:\\Log" + va_list + ".txt";
            sr1 = new StreamReader(fileName);
            sr = new StreamReader(fileName);
            string resultat = sr1.ReadToEnd();
                
            richTextBox1.Text = resultat;

            string ligne;
            while ((ligne = sr.ReadLine()) != null)
            {
                nbligne++;
            }
            MessageBox.Show(nbligne.ToString());
            sr1.Close();
            sr.Close();


Fais plutôt :

string result = reader.ReadToEnd();
int lines = result.Split(new char[] { '\n' }).Length;
MessageBox.Show(lines.ToString());


comme ça le fichier est ouvert une fois et terminer, te trimbale avec plusieurs instances du même fichier...
Messages postés
48
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
4 février 2010

oui je suis d'accord avec toi mais ce code me donne le nombre de ligne et je voudrai aussi afficher le contenu du fichier "test.txt" dans ma richtextbox et c'est la que ca coince.

Une idée ?
Messages postés
268
Date d'inscription
lundi 1 mars 2004
Statut
Membre
Dernière intervention
19 avril 2012
11
Difficile de donner plus d'indications,

fait ceci :

for(...)
{
try
{
[... ton code ...]
}
catch(OutOfMemoryException e)
{
MessageBox.Show(string.Format("Source : {0}\nMessage : {1}\nStackTrace : {2}",
e.Source, e.Message, e.StackTrace));
}
}

Peut être que l'on pourrait cerner mieux le problème...
Messages postés
48
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
4 février 2010

Voila le message d'erreur :

Source : mscorlib
Message : Une exception de type 'System.OutOfMemoryException' a été levée.
StackTrace : à System.String.GetStringForStringBuilder(String value, Int32 startIndex, Int32length, Int32 capacity)
à System.Text.StringBuilder.GetNewString(String currentString, Int32 requiredLength)
à System.Text.StringBuilder.Append(Char[] value, Int32 startIndex, Int32 charCount)
à System.IO.Streamreader.ReadToEnd()
à test3.FormAnalyse.enable() dans D:\MAERTENA\My Documents\test3\test3\FormAnalyse.cs:ligne 154
Messages postés
268
Date d'inscription
lundi 1 mars 2004
Statut
Membre
Dernière intervention
19 avril 2012
11
Franchement je ne vois pas d'où ça peut venir,
normalement un StringBuilder peut contenir près de 2 milliards de caractères, alors on a de la marge avec 200 Mo de données. Peut être un problème de streamreader...

Pour le coup je ne peux pas t'aider plus...
Messages postés
48
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
4 février 2010

ok je te remercie tout de meme de ton aide qui m'as été bien précieuse. Je recherche une solution au problème mais pour l'instant je n'ai pas encore trouver la solution.
Messages postés
48
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
4 février 2010

personne n'aurait une idée par hasard?
Messages postés
48
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
4 février 2010

up
Messages postés
48
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
4 février 2010

c'est bon j'ai trouvé la solution.

J'ai mit mon 2e traitement dans le 1er en utilisant le streamreader du 1er traitement. A mon avis vu qu'il y avait trop de streamreader, l'appli planter, je pense que sa devait etre a cause de ça.

Voila A+