SaveFileDialog et StreamWriter

[Résolu]
Signaler
Messages postés
9
Date d'inscription
jeudi 12 février 2009
Statut
Membre
Dernière intervention
22 avril 2010
-
Messages postés
23
Date d'inscription
lundi 30 décembre 2002
Statut
Membre
Dernière intervention
7 novembre 2020
-
Bonjour à tous,
J'ai un problème avec une fonction qui me permet d'exporter le contenu de mon ListView dans un fichier CSV.
J'utilise un menustrip, avec un toolstripmenuitem (Exporter en CSV).
Lorsque je clique dessus, un SaveFileDialog s'ouvre et quand j'enregistre après avoir indiqué un nom de fichier, j'ai une erreur IOException.
Le processus ne peut pas accéder au fichier 'C:\nomdufichier.csv', car il est en cours d'utilisation par un autre processus
using (StreamWriter sw = new System.IO.StreamWriter(saveFileDialog1.FileName, false, System.Text.Encoding.Default))


Avez vous des conseils pour régler le problème ? Merci

3 réponses

Messages postés
23
Date d'inscription
lundi 30 décembre 2002
Statut
Membre
Dernière intervention
7 novembre 2020

Bah tiens ? Dans ton code il n'y a pas d'instruction using du coup...

Une première solution consiste à remplacer la ligne
System.IO.StreamWriter sw = new System.IO.StreamWriter(saveFileDialog1.FileName);

par
System.IO.StreamWriter sw = new System.IO.StreamWriter(myStream);


Une deuxième solution consiste à virer la ligne
if ((myStream = saveFileDialog1.OpenFile()) !=  null)

et les accolades associés, ainsi que la variable « Stream myStream; » qui sera du coup inutilisée.

Explication :
Lorsque tu effectue « saveFileDialog1.OpenFile() », la SaveFileDialog ouvre pour toi le fichier et se l'accapare.

Si tu tente de faire juste après « System.IO.StreamWriter sw = new System.IO.StreamWriter(saveFileDialog1.FileName) », tu tente d'ouvrir une seconde fois le fichier, déjà ouvert par la SaveFileDialog.


Dans tous les cas, à la fin de ta méthode il te faut appeler la méthode « Dispose() » :
saveFileDialog1.Dispose();
myStream.Dispose();
Messages postés
23
Date d'inscription
lundi 30 décembre 2002
Statut
Membre
Dernière intervention
7 novembre 2020

Salut !

Je ne te fais pas l'affront de te demander si ton CSV n'est pas ouvert par Excel ou autre en parallèle...

Je vois que tu utilises l'instruction using : elle s'occupe donc de libérer les ressources occupées par le StreamWriter. Est-ce que tu a pensé à appeler la méthode « Dispose() » de ta SaveFileDialog après l'enregistrement ? Je ne suis pas certain, mais possible qu'elle s'accapare le fichier.

Avant toute chose, utilise l'utilitaire Unlocker pour t'assurer que ton fichier CSV est libre. À force de faire des test, peut-être qu'un programme mal foutu se l'est accaparer.
Messages postés
9
Date d'inscription
jeudi 12 février 2009
Statut
Membre
Dernière intervention
22 avril 2010

Merci de ta rapidité Picsonald, j'ai regardé les threads ouvert mais aucun n'était en parralèle avec le fichier CSV.
Peux-tu jetter un oeil sur ma fonction ?
private void exporterEnCSVToolStripMenuItem_Click(object sender, EventArgs e)
{
            Stream myStream;
            SaveFileDialog saveFileDialog1 = new SaveFileDialog();

            saveFileDialog1.Filter = "CSV files (*.csv)|*.csv|All files (*.*)|*.*";
            saveFileDialog1.FilterIndex = 2;
            saveFileDialog1.RestoreDirectory = true;
            saveFileDialog1.AddExtension = true;
            saveFileDialog1.InitialDirectory = @"C:/";

            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                if ((myStream = saveFileDialog1.OpenFile()) != null)
                {
                    System.IO.StreamWriter sw = new System.IO.StreamWriter(saveFileDialog1.FileName);
                   
                    //ajout du titre des colonnes
                        foreach (ColumnHeader c in UserView.Columns)
                        {
                            sw.WriteLine(textBox1.Text);
                            sw.Write(string.Format("{0};", c.Text));
                            sw.WriteLine("");
                        }

                        // ajout des données
                        foreach (ListViewItem item in UserView.Items)
                        {
                            foreach (ListViewItem.ListViewSubItem subitem in item.SubItems)
                            {
                                sw.Write(string.Format("{0};", subitem.Text));
                                sw.WriteLine("");
                            }
                        }
                }
            }
}