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

vto59 Messages postés 48 Date d'inscription lundi 4 janvier 2010 Statut Membre Dernière intervention 4 février 2010 - 27 janv. 2010 à 09:32
vto59 Messages postés 48 Date d'inscription lundi 4 janvier 2010 Statut Membre Dernière intervention 4 février 2010 - 29 janv. 2010 à 11:53
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

MasterShadows Messages postés 268 Date d'inscription lundi 1 mars 2004 Statut Membre Dernière intervention 19 avril 2012 12
27 janv. 2010 à 10:57
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
0
vto59 Messages postés 48 Date d'inscription lundi 4 janvier 2010 Statut Membre Dernière intervention 4 février 2010
27 janv. 2010 à 11:40
Oui c'est bon sa marche nikel. Je te remercie de m'avoir aider !!!

A+
0
vto59 Messages postés 48 Date d'inscription lundi 4 janvier 2010 Statut Membre Dernière intervention 4 février 2010
27 janv. 2010 à 11:58
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?
0
MasterShadows Messages postés 268 Date d'inscription lundi 1 mars 2004 Statut Membre Dernière intervention 19 avril 2012 12
27 janv. 2010 à 12:55
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();
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vto59 Messages postés 48 Date d'inscription lundi 4 janvier 2010 Statut Membre Dernière intervention 4 février 2010
27 janv. 2010 à 13:48
Non j'ai toujours ce meme problème et apparemment le problème intervient au niveau de cette ligne :

string resultat = sr1.ReadToEnd();
0
vto59 Messages postés 48 Date d'inscription lundi 4 janvier 2010 Statut Membre Dernière intervention 4 février 2010
27 janv. 2010 à 13:52
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();
0
vto59 Messages postés 48 Date d'inscription lundi 4 janvier 2010 Statut Membre Dernière intervention 4 février 2010
27 janv. 2010 à 14:13
et sinon pour indication les 50 fichiers rassembler en un seul fait 200mo
0
MasterShadows Messages postés 268 Date d'inscription lundi 1 mars 2004 Statut Membre Dernière intervention 19 avril 2012 12
27 janv. 2010 à 16:00
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...
0
vto59 Messages postés 48 Date d'inscription lundi 4 janvier 2010 Statut Membre Dernière intervention 4 février 2010
27 janv. 2010 à 16:31
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 ?
0
MasterShadows Messages postés 268 Date d'inscription lundi 1 mars 2004 Statut Membre Dernière intervention 19 avril 2012 12
27 janv. 2010 à 17:38
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...
0
vto59 Messages postés 48 Date d'inscription lundi 4 janvier 2010 Statut Membre Dernière intervention 4 février 2010
28 janv. 2010 à 10:08
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
0
MasterShadows Messages postés 268 Date d'inscription lundi 1 mars 2004 Statut Membre Dernière intervention 19 avril 2012 12
28 janv. 2010 à 11: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...
0
vto59 Messages postés 48 Date d'inscription lundi 4 janvier 2010 Statut Membre Dernière intervention 4 février 2010
28 janv. 2010 à 11:27
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.
0
vto59 Messages postés 48 Date d'inscription lundi 4 janvier 2010 Statut Membre Dernière intervention 4 février 2010
28 janv. 2010 à 15:49
personne n'aurait une idée par hasard?
0
vto59 Messages postés 48 Date d'inscription lundi 4 janvier 2010 Statut Membre Dernière intervention 4 février 2010
29 janv. 2010 à 09:17
up
0
vto59 Messages postés 48 Date d'inscription lundi 4 janvier 2010 Statut Membre Dernière intervention 4 février 2010
29 janv. 2010 à 11:53
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+
0
Rejoignez-nous