StreamWriter se moque du paramètre append

Résolu
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 - 2 oct. 2006 à 16:46
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 - 7 oct. 2006 à 12:06
Bonjour,

Voici mon instanciation de StreamWriter :
StreamWriter sw = new StreamWriter("logs\\Error.log", true, Encoding.Unicode);

Donc append : true
Mais que je mette true ou false, il s'en fout, il m'écrase mon fichier.

Dois-je plutôt passer par un FileStream ?
Quelle est la solution la plus fiable pour écrire du texte dans un fichier ?

Merci
A voir également:

20 réponses

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
2 oct. 2006 à 17:42
Je ne peux pas bcp plus t'aider avec si peu d'informations (le probleme doit venir d'ailleurs dans ton programme, car c'est clair que le StreamWriter fonctionne, même si tu lui passes true comme paramètre ).
Peut-etre que c'est un probleme d'Encoding? Mais je ne pense pas...

Petite remarque : oublie string path = "logs\"+DateTime.Now.Day.ToString()+".log";
Utilise string.Format à la place.

VC# forever
3
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
2 oct. 2006 à 20:57
Salut,

Histoire d'en rajouter un peu je dirais aussi :
- ne pas utiliser de chemin relatif
- pas d'écriture dans le répertoire d'installation de l'application

string logsDirectoryPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"MonAppli\logs");
string path = Path.Combine(logsDirectoryPath, string.Format("{0}.log", DateTime.Now.Day));

ou

string logsDirectoryPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), @"MonAppli\logs");
string path = Path.Combine(logsDirectoryPath, string.Format("{0}.log", DateTime.Now.Day));

Tellement plus beau ;-)

/*
coq
MVP Visual C#
CoqBlog
*/
3
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
3 oct. 2006 à 16:09
Essaye de mettre locker ta méthode d'écriture dans ton fichier, pour etre sur qu'elle n'est pas appelée de facon "ré-entrante'. Ca ressemblerai à ça :

[ThreadStatic]
private static object lockObject = new Object();

public TaMethode()
{
    lock(lockObject)
    {
       // Ton code a protéger
    }
}

(Par contre je ne sais plus s'il faut mettre ou non l'attribut [ThreadStatic]..)
3
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
2 oct. 2006 à 17:00
Salut,
Non, ça fonctionne, tu dois faire une autre erreur quelques part d'autre.
Par exemple, comment écris-tu dans le fichier par la suite? Fermes-tu bien le fichier?

VC# forever
0

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

Posez votre question
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
2 oct. 2006 à 17:09
En fait, je fais un peu le sauvage, j'ouvre et ferme à chaque écriture de ligne.

Dans ma fonction DisplayError, j'ai :

string path = "logs\"+DateTime.Now.Day.ToString()+".log";
StreamWriter sw = new StreamWriter(path, true, Encoding.Unicode);

sw.WriteLine(strError);
sw.Close();

Voilà en gros mon code, le seul truc que j'ai pas mis ici, c'est comment je remplit la chaine strError, mais c'est accessoire pour mon pb .

Je n'ai pas de code ailleurs qui utilise ce fichier.
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
2 oct. 2006 à 17:19
Met un try-catch autour du StreamWriter et regarde si y'a une exception (peut etre des problemes de droit sur le fichier, fichier mal fermé, etc).
sw.Close() et sw = null dans le bloc finally.

Et effectivement, ca serait plus logique d'écrire les données dans un tampon, puis de tout écrire en une fois plutôt que d'ouvrir et fermer à tout vas...

VC# forever
0
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
2 oct. 2006 à 17:35
Pas mieux, et pas d'exception.

Par contre, chose très étrange, je trace le démarrage et l'arrêt de l'appli, et dans mes traces j'ai 2 lignes :le stop et le start et le trace d'après écrase tout.

Quand je fais du pas à pas, le 1er new se passe bien : j'ai toujours mon fichier de log, par contre le 2e new supprime le fichier.

Pour le moment, je teste mon module, à terme c'est clair que j'ouvrirai le fichier au démarrage et le fermerai à la fermeture ou à minuit. Mais je me dit qu'en faisant comme ça, je pense que j'aurais jamais vu ce pb.
0
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
2 oct. 2006 à 18:02
Ok merci pour ton aide, c'est vrai que je dois avoir une merde ailleurs.

C'est vrai que string.Format, c'est plus propre, pourtant je devrais y être habitué c'est presque comme le printf. Mais bon, des fois, ce sont les vieux démons VB6 qui apparaissent.
0
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
3 oct. 2006 à 09:39
Donc, si je comprends bien, pour toi, le plus propre est de mettre les fichiers créés par les applis dans ApplicationData de l'utilisateur courant. Ok, j'en prends note
Merci pour le conseil.
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
3 oct. 2006 à 10:23
Ouai c'est depuis qu'il a perdu sa sauvegarde de jeu.
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
3 oct. 2006 à 10:34
L'est enervé le coq depuis

Mx
MVP C# 
0
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
3 oct. 2006 à 10:51
Ca se comprend surtout si c'est un jeu de rôle ou autre GTA, tout perdre après y avoir passé des heures et tout refaire c'est rageant.
J'ai aussi vécu cette désagréable expérience.
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
3 oct. 2006 à 10:54
En fait, c'est parce que c'est l'exemple qu'il avait pris sur son blog, devenu une référence depuis le temps

Mx
MVP C# 
0
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
3 oct. 2006 à 11:34
Ah ok !!!
Coq aurait du me donner le lien vers l'article de son blog, c'est très instructif.
0
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
3 oct. 2006 à 14:16
Ton bout de code est-il appelé par plusieurs threads distincts?
0
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
3 oct. 2006 à 16:01
Euh oui,

Vu que c'est mon gestionnaire d'erreur et l'erreur peut venir du thread principal ou du thread qui gère ma connexion UDP entre autre.
J'ai mis des delegate dans l'IHM, je sens que je vais aussi en mettre dans la Dll (multithread).

Je crois que je n'ai pas encore d'en apprendre sur le multi-threading.
0
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
3 oct. 2006 à 17:07
Merci,

Oui il faut que je me protège de la ré-éntrance, mais dansma phase de test, je suis sure que je ne ré entre pas.
C'est dingue, parallèlement je trace avec la fonction Trace.WriteLine (qui marche) pour analyser le problème, j'ai toujours mon pb même si je suis dans le même Thread (trace start et stop de l'appli), le fichier est écrasé à la 2e instanciation de StreamWriter.

Bref, je vais ouvrir le flux en permanence pour éviter le problème (et ça sera plus propre) en mettant en place le locker, et tout devrait marcher.
0
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
3 oct. 2006 à 17:34
Putain c'est pas possible, passer autant de temps sur une connerie pareil !!!!Je ne regardais pas là où il fallait, j'ai un test un peu plus haut dans le code et au lieu de mettre !j'avais mis.
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
7 oct. 2006 à 12:01
:p

Sinon il me semble qu'utiliser lock sur un champs ThreadStatic ne sert à rien, comme justement il existera une instance par thread.
Je vais essayer d'appronfondir le sujet tiens.

/*
coq
MVP Visual C#
CoqBlog
*/
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
7 oct. 2006 à 12:06
Approfondir* (du mal avec ce mot là décidément -_-)

/*
coq
MVP Visual C#
CoqBlog
*/
0
Rejoignez-nous