StreamWriter se moque du paramètre append [Résolu]

fregolo52 1107 Messages postés mercredi 15 juin 2011Date d'inscription 16 juin 2018 Dernière intervention - 2 oct. 2006 à 16:46 - Dernière réponse : cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention
- 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
Afficher la suite 

Votre réponse

20 réponses

Meilleure réponse
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 2 oct. 2006 à 17:42
3
Merci
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

Merci cs_Bidou 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 124 internautes ce mois-ci

Commenter la réponse de cs_Bidou
Meilleure réponse
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 2 oct. 2006 à 20:57
3
Merci
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
*/

Merci cs_coq 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 124 internautes ce mois-ci

Commenter la réponse de cs_coq
Meilleure réponse
Nikoui 794 Messages postés vendredi 24 septembre 2004Date d'inscription 19 août 2008 Dernière intervention - 3 oct. 2006 à 16:09
3
Merci
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]..)

Merci Nikoui 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 124 internautes ce mois-ci

Commenter la réponse de Nikoui
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 2 oct. 2006 à 17:00
0
Merci
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
Commenter la réponse de cs_Bidou
fregolo52 1107 Messages postés mercredi 15 juin 2011Date d'inscription 16 juin 2018 Dernière intervention - 2 oct. 2006 à 17:09
0
Merci
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.
Commenter la réponse de fregolo52
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 2 oct. 2006 à 17:19
0
Merci
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
Commenter la réponse de cs_Bidou
fregolo52 1107 Messages postés mercredi 15 juin 2011Date d'inscription 16 juin 2018 Dernière intervention - 2 oct. 2006 à 17:35
0
Merci
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.
Commenter la réponse de fregolo52
fregolo52 1107 Messages postés mercredi 15 juin 2011Date d'inscription 16 juin 2018 Dernière intervention - 2 oct. 2006 à 18:02
0
Merci
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.
Commenter la réponse de fregolo52
fregolo52 1107 Messages postés mercredi 15 juin 2011Date d'inscription 16 juin 2018 Dernière intervention - 3 oct. 2006 à 09:39
0
Merci
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.
Commenter la réponse de fregolo52
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 3 oct. 2006 à 10:23
0
Merci
Ouai c'est depuis qu'il a perdu sa sauvegarde de jeu.
Commenter la réponse de Lutinore
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 3 oct. 2006 à 10:34
0
Merci
L'est enervé le coq depuis

Mx
MVP C# 
Commenter la réponse de MorpionMx
fregolo52 1107 Messages postés mercredi 15 juin 2011Date d'inscription 16 juin 2018 Dernière intervention - 3 oct. 2006 à 10:51
0
Merci
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.
Commenter la réponse de fregolo52
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 3 oct. 2006 à 10:54
0
Merci
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# 
Commenter la réponse de MorpionMx
fregolo52 1107 Messages postés mercredi 15 juin 2011Date d'inscription 16 juin 2018 Dernière intervention - 3 oct. 2006 à 11:34
0
Merci
Ah ok !!!
Coq aurait du me donner le lien vers l'article de son blog, c'est très instructif.
Commenter la réponse de fregolo52
Nikoui 794 Messages postés vendredi 24 septembre 2004Date d'inscription 19 août 2008 Dernière intervention - 3 oct. 2006 à 14:16
0
Merci
Ton bout de code est-il appelé par plusieurs threads distincts?
Commenter la réponse de Nikoui
fregolo52 1107 Messages postés mercredi 15 juin 2011Date d'inscription 16 juin 2018 Dernière intervention - 3 oct. 2006 à 16:01
0
Merci
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.
Commenter la réponse de fregolo52
fregolo52 1107 Messages postés mercredi 15 juin 2011Date d'inscription 16 juin 2018 Dernière intervention - 3 oct. 2006 à 17:07
0
Merci
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.
Commenter la réponse de fregolo52
fregolo52 1107 Messages postés mercredi 15 juin 2011Date d'inscription 16 juin 2018 Dernière intervention - 3 oct. 2006 à 17:34
0
Merci
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.
Commenter la réponse de fregolo52
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 7 oct. 2006 à 12:01
0
Merci
: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
*/
Commenter la réponse de cs_coq
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 7 oct. 2006 à 12:06
0
Merci
Approfondir* (du mal avec ce mot là décidément -_-)

/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq

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.