Dans une WinForm, le "CurrentDirectory" non pris encompte

Résolu
molo2003 Messages postés 50 Date d'inscription mardi 9 janvier 2007 Statut Membre Dernière intervention 9 juin 2023 - Modifié le 8 juin 2023 à 10:10
molo2003 Messages postés 50 Date d'inscription mardi 9 janvier 2007 Statut Membre Dernière intervention 9 juin 2023 - 9 juin 2023 à 09:57

Bonjour,

j'utilise VS 2022 Enterprise, et dans un "SaveFile Dialog",j'ai validé de "CurrentDIrectory"  ou un autre directory  ...

et malgré ce mon fichier est sauvegardé dans le dossier "Debug" de mon projet.

Ci dessous le code partiel de mon appli:

    // Environment.CurrentDirectory = "D:\\DONNEES\\Thunderbird\\2024";      ou encore               

saveFileDialog1.InitialDirectory = Environment.GetFolderPath( Environment.SpecialFolder.MyComputer );
                saveFileDialog1.FileName = "TOTO.csv";
                saveFileDialog1.CheckPathExists = true;
                
                saveFileDialog1.OverwritePrompt = true;
                saveFileDialog1.CreatePrompt = true;                
                saveFileDialog1.RestoreDirectory = true;


                            dr = saveFileDialog1.ShowDialog();      

Malgré cela , mon fichier "TOTO.csv" se trouve dans "Debug" du projet et non dans le repertoire affiché dans la boite de dialogue.

Merci d'avance de me dire le pourquoi du comment ????

Molo

13 réponses

Whismeril Messages postés 19082 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 juillet 2024 658
7 juin 2023 à 22:06

Bonsoir 

pour tes prochains posts, merci de faire comme décrit là https://codes-sources.commentcamarche.net/faq/11288-poster-un-extrait-de-code

Tu ne montres pas la partie de code qui enregistre le fichier, c'est probablement là que se situe le problème 


molo2003 Messages postés 50 Date d'inscription mardi 9 janvier 2007 Statut Membre Dernière intervention 9 juin 2023
7 juin 2023 à 23:31

Bonjour et merci Whismeril;

Voici l'extrait de code:

   StreamWriter sw = new StreamWriter( "TOTO.csv",true, Encoding.GetEncoding(1252 ));

                                int i = 0;

                        while (t_nv_adh[i] != null)
                        {
                            sw.WriteLine(t_nv_adh[i]);
                            i++;                        
                        }

                        sw.Close();

                     //   string reper = "D:\\DONNEES\\Thunderbird\\";
                     //   string nom_fich = reper + nom_fich_seul;

             //    string sfp =       Environment.GetFolderPath(Environment.SpecialFolder.Personal);

                   


                        SaveFileDialog sfd = new SaveFileDialog();
                 
                        sfd.CreatePrompt = true;
                        sfd.FileName = "TOTO.csv";
                        sfd.InitialDirectory = @"D:\DONNEES\Thunderbird\2024";
                        sfd.OverwritePrompt = true;

                          dr =   sfd.ShowDialog();                             //  Boite dialog pour sauvegarder un fichier dans un reper

                   if (dr == DialogResult.OK)
                   MessageBox.Show(" Le fichier a été sauvegardé", "Sauvegarde", MessageBoxButtons.OK);
                   else
                   MessageBox.Show("NOOOOOOOOOONNNNNNNNNNNNNNN", "NON",MessageBoxButtons.OK);
Whismeril Messages postés 19082 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 juillet 2024 658
8 juin 2023 à 07:40

Ligne 1, tu lui dis d'écrire le fichier à l'emplacement de l'exe avec le nom "toto.csv".

Il faut mettre le chemin choisi dans la boite de dialogue à ce moment-là 


molo2003 Messages postés 50 Date d'inscription mardi 9 janvier 2007 Statut Membre Dernière intervention 9 juin 2023
8 juin 2023 à 08:09

Bonjour et merci Whismeril

Je choisis le dossier de sauvegarde dans la fenêtre de SaveFileDialog  non ? Comment dans l'explorateur de fichier  non?

Bizarre de bizarre !!!

Je te joins une capture d'écran image de la fenêtre de la sauvegarde: j'ai bien choisi me "dossier de sauvegarde" ... quand je clik sur "Enregistrer" il me demande ... "voulez vousl le créer ?" je réponds "OK"  et malgré ce  ... a la fermeture de l'appli, je trouve toujours mon fichier sauvegardé "TOTO.csv" dans le répertoire de l'exe. C'est lors de l'exécution de la sauvegarde que cela se passe, mais invisible pour l'utilisateur  ???

Dans le debbogage, j'ai défini le "Current Directory" dans mon appli ... et ligne par ligne il reste le même (normal), à aucun moment je ne vois le Directory de l'exe apparaitre. N'est pas une variable de l'environnement VS Studio figée, modifiable dans les "Options" du projet ???

   Merci  à plus

Molo

Capture écran de la sauvegarde

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

Posez votre question
Whismeril Messages postés 19082 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 juillet 2024 658
8 juin 2023 à 08:19

Cette ligne

StreamWriter sw = new StreamWriter( "TOTO.csv",true, Encoding.GetEncoding(1252 ));

Dit explicitement au programme que le fichier dans lequel on écrit est le chemin relatif toto.csv.

Comme c'est un chemin relatif, c'est par rapport à l'emplacement de l'exe.

Si tu veux vérifier, sélectionne tata.csv avec ta boite de dialogue et tu verras que le fichier de sortie reste toto.csv.

Et donc, à cette ligne, il faut mettre la variable dans laquelle tu auras stocké le chemin complet du fichier sélectionné dans la boite de dialogue 


Whismeril Messages postés 19082 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 juillet 2024 658
8 juin 2023 à 08:22

Ha, autant pour moi, tu as utilisé une svaefiledialog et pas une openfiledialog.

Cette boite de dialogue t'ouvre directement un stream, que tu as stocké dans dr, c.est donc ce stream que tu dois utiliser pour écrire et pas un nouveau ouvert plus loin.


molo2003 Messages postés 50 Date d'inscription mardi 9 janvier 2007 Statut Membre Dernière intervention 9 juin 2023
8 juin 2023 à 08:45

Encore merci Whismeril

En effet si dans le StrealWriter, je donne le chemin complet de mon fichier, je le retrouve bien là où je veux.

Donc la "SaveFileDialog" ne sert à rien.

Moi je pensais que le StreamWriter créait un fichier nommé "TOTO.csv" et que par la boite "SaveFileDialog" je l'enregistrais dans le dossier que je choisissais.

C'est trompeur !!!  car l'utilisation de la "SaveFileDialog" est semblable à l'explorateur de fichier ... comme un "Enregistrer sous" pour un fichier quelconque. Et donc les fonctionnalités de "OpenFile Dialog"  et "SaveFileDialog" sont tous à fait différente .... les propriétés de "savefiledialog.InitialDirectory"  et autres ... ne sont pas fonctionnelles ... la documentation est imprécise à ce sujet.

Bonne journée  Whismeril

Molo

Whismeril Messages postés 19082 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 juillet 2024 658
8 juin 2023 à 09:05

Moi je pensais que le StreamWriter créait un fichier nommé "TOTO.csv" et que par la boite "SaveFileDialog" je l'enregistrais dans le dossier que je choisissais

oui si tu envoies des données au stream ouvert par cette boite de dialogue, or tu ouvres un autre stream et c'est à ce second stream que tu envoies les données.

Comme je t'ai dit dans mon message de 8:22, il faut que tu utilises le stream ouvert par la boite de dialogue.

C'est trompeur !!!  car l'utilisation de la "SaveFileDialog" est semblable à l'explorateur de fichier ... comme un "Enregistrer sous" pour un fichier quelconque. Et donc les fonctionnalités de "OpenFile Dialog"  et "SaveFileDialog" sont tous à fait différente .... les propriétés de "savefiledialog.InitialDirectory"  et autres ... ne sont pas fonctionnelles ... la documentation est imprécise à ce sujet.

Oui, sauf que le codeur de l'explorateur de fichier se sert du stream de la boite de dialogue, alors que toi non.

Le code exemple de la doc est 

private void button1_Click(object sender, System.EventArgs e)
 {
     Stream myStream ;
     SaveFileDialog saveFileDialog1 = new SaveFileDialog();
 
     saveFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"  ;
     saveFileDialog1.FilterIndex = 2 ;
     saveFileDialog1.RestoreDirectory = true ;
 
     if(saveFileDialog1.ShowDialog() == DialogResult.OK)
     {
         if((myStream = saveFileDialog1.OpenFile()) != null)
         {
             // Code to write the stream goes here.
             myStream.Close();
         }
     }
 }

Pour moi, c'est explicite qu'il fait utiliser mystream pour écrire les datas
Si pour toi ce n'est pas assez clair, c'est peut-être qu'il te manque des bases.


molo2003 Messages postés 50 Date d'inscription mardi 9 janvier 2007 Statut Membre Dernière intervention 9 juin 2023
8 juin 2023 à 10:41

Oui suivant la doc que tu cites! un stream mystreal est à utiliser mais ...

Quand dans mon code je tape "SaveFileDialog"  ... le menu contextuel me dit:

" Classe System.Windows.Forms.SaveFileDialog ... Invite l'utilisateur à sélectionner un emplacement pour enregistrer un fichier. Cette classe ne peut être héritée"

Là ce me rapproche de l'explorateur de fichier. NON ?

Bref, ok donc un StreamWritter me suffit pour créer et "localiser" mon fichier par son chemin complet. SaveFileDialog à la poubelle !!!

je vais mettre en "Résolu"

Grand merci encore à toi

  A plus certainement ... mais mon petit projet arrive au bout ... presque au bout .... suis sollicité par de nouvelles demandes...

Whismeril Messages postés 19082 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 juillet 2024 658
8 juin 2023 à 12:23

le menu contextuel me dit:

" Classe System.Windows.Forms.SaveFileDialog ... Invite l'utilisateur à sélectionner un emplacement pour enregistrer un fichier. Cette classe ne peut être héritée"

Ça, c'est pas la doc, c'est le résumé dont https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.savefiledialog?view=windowsdesktop-7.0

Là ce me rapproche de l'explorateur de fichier. NON ?

Je persiste non.

un StreamWritter me suffit pour créer et "localiser" mon fichier par son chemin complet. SaveFileDialog à la poubelle !!!

Oui, mais savefiledialog te crée le stream, donc il ne faut pas en ouvrir un autre


molo2003 Messages postés 50 Date d'inscription mardi 9 janvier 2007 Statut Membre Dernière intervention 9 juin 2023
8 juin 2023 à 17:40

Whismeril ... même en "Résolu" je peux te répondre ?

Oui je ne savais pas que SaveFileDialog créait un Stream ... oui bien sur, je comprends bien qu'un seul est nécessaire pour traiter un fichier. ... j'aurai appris encore une chose.

   Encore grand merci à toi

   A plus

Molo

Whismeril Messages postés 19082 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 juillet 2024 658
8 juin 2023 à 17:50

Résolu ne ferme pas la discussion.

Si plus tard quelqu'un trouve son bonheur ici, il pourra dire merci

Ou si quelqu'un d'autre a un problème proche, il pourra poser une question complémentaire 

0
Whismeril Messages postés 19082 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 9 juillet 2024 658
9 juin 2023 à 09:45

Hier j'étais sur ma tablette, ce qui n'est pas super pratique pour développer un "argument".

Là ce me rapproche de l'explorateur de fichier. NON ?

Je vais faire une analogie jardinage.

Supposons que ton voisin dispose d'un super potager, il a mis des gouttes à gouttes à chacun de ses plants.

Il a 2 réseaux d'irrigation et un programmateur 2 voies.


Tu te dis que c'est pas mal, mais comme tu débutes, tu ne vas faire que des tomates, tu plantes quelques plants, tu poses un réseau d'irrigation avec des gouttes à gouttes et tu relies le tout à ton programmateur 2 voies sur la voie A.

Et ensuite, tu configures le programmateur pour qu'il ouvre 30 minutes toutes les nuits la voie B.

Conclusion, l'herbe au pied de ton programmateur est bien verte et tes tomates ont soif.


On voit bien que tu t'es inspiré du voisin, mais à un moment, y'a eu mauvais aiguillage et/ou connexion 

Ben en programmation, c'est pareil, si tu fais un truc d'un côté et un truc de l'autre, mais que tu ne les relies pas, ça ne marche pas. C'est pas magique, un programme ça fait ce que tu lui dis de faire et rien d'autre.


molo2003 Messages postés 50 Date d'inscription mardi 9 janvier 2007 Statut Membre Dernière intervention 9 juin 2023
9 juin 2023 à 09:57

Bonjour Whismeril;

OUI en effet ta comparaison est idéale... et je la comprends trop bien car ...

je suis Gardois (région d'Alès) mais chuttt !!!   ...  et j'adore le potager que je cultive avec soin ...mais sans arrosage automatique !!!

Là aussi , c'est le bon Dieu qui (fait le programme) ... pas toujours à notre convenance ... exemple l'an dernier avec canicule tout l'été  ... même un fort arrosage manuel n'a pas fait dorer les tomates, aubergines et autres ...

 Ce printemps ... de la pluie, le potager se porte bien  ....  mais l'été n'est pas commencé ... à voir ????

Merci bonne journée

Rejoignez-nous