SaveFileDialog et StreamWriter

Résolu
jhamy Messages postés 9 Date d'inscription jeudi 12 février 2009 Statut Membre Dernière intervention 22 avril 2010 - 21 avril 2010 à 14:34
Picsonald Messages postés 23 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 7 novembre 2020 - 22 avril 2010 à 14:58
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
A voir également:

3 réponses

Picsonald Messages postés 23 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 7 novembre 2020
22 avril 2010 à 14:58
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();
Picsonald Messages postés 23 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 7 novembre 2020
21 avril 2010 à 15:24
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.
jhamy Messages postés 9 Date d'inscription jeudi 12 février 2009 Statut Membre Dernière intervention 22 avril 2010
21 avril 2010 à 15:31
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("");
                            }
                        }
                }
            }
}
Rejoignez-nous