StreamWriter se moque du paramètre append

[Résolu]
Signaler
Messages postés
1115
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
6 mai 2021
-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
-
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

20 réponses

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
58
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
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
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
*/
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
10
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]..)
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
58
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
Messages postés
1115
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
6 mai 2021
4
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.
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
58
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
Messages postés
1115
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
6 mai 2021
4
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.
Messages postés
1115
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
6 mai 2021
4
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.
Messages postés
1115
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
6 mai 2021
4
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.
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
Ouai c'est depuis qu'il a perdu sa sauvegarde de jeu.
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
54
L'est enervé le coq depuis

Mx
MVP C# 
Messages postés
1115
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
6 mai 2021
4
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.
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
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# 
Messages postés
1115
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
6 mai 2021
4
Ah ok !!!
Coq aurait du me donner le lien vers l'article de son blog, c'est très instructif.
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
10
Ton bout de code est-il appelé par plusieurs threads distincts?
Messages postés
1115
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
6 mai 2021
4
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.
Messages postés
1115
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
6 mai 2021
4
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.
Messages postés
1115
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
6 mai 2021
4
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.
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
: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
*/
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
97
Approfondir* (du mal avec ce mot là décidément -_-)

/*
coq
MVP Visual C#
CoqBlog
*/