SaveFileDialog et StreamWriter [Résolu]

jhamy 9 Messages postés jeudi 12 février 2009Date d'inscription 22 avril 2010 Dernière intervention - 21 avril 2010 à 14:34 - Dernière réponse : Picsonald 22 Messages postés lundi 30 décembre 2002Date d'inscription 3 mars 2011 Dernière intervention
- 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
Afficher la suite 

3 réponses

Répondre au sujet
Picsonald 22 Messages postés lundi 30 décembre 2002Date d'inscription 3 mars 2011 Dernière intervention - 22 avril 2010 à 14:58
+3
Utile
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();
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Picsonald
Picsonald 22 Messages postés lundi 30 décembre 2002Date d'inscription 3 mars 2011 Dernière intervention - 21 avril 2010 à 15:24
0
Utile
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.
Commenter la réponse de Picsonald
jhamy 9 Messages postés jeudi 12 février 2009Date d'inscription 22 avril 2010 Dernière intervention - 21 avril 2010 à 15:31
0
Utile
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("");
                            }
                        }
                }
            }
}
Commenter la réponse de jhamy

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.