Forcer StreamWriter pour modifier le Codage
Je suis en train d'enregistrer un fichier à l'aide de DialogResult
et StringBuilder
. Après avoir fait le texte, je vais appeler le code suivant pour enregistrer le fichier:
if (dr == DialogResult.OK)
{
StreamWriter sw = new StreamWriter(saveFileDialog1.FileName);
sw.Write(sb.ToString());
sw.Close();
}
J'ai essayé d'ajouter le deuxième paramètre à StreamWriter
comme Encoding.UTF8
mais depuis le premier argument est un string
plutôt qu'un Stream
, il ne veut pas compiler.
Comment puis-je convertir cette chaîne pour un cours d'eau pour être en mesure de passer le second paramètre que l'Encodage?
La raison pour cela, c'est que quelque part dans mon texte j'ai µ
mais lorsque le fichier est enregistré, il montre comme μ
de sorte que le µ
est arriver screwd!
Grâce
Vous devez vous connecter pour publier un commentaire.
Juste l'emballer dans un
FileStream
.Si vous voulez ajouter, utilisez
FileMode.Append
à la place.Vous devez également appeler
Dispose()
sur untry/finally
bloc, ou utiliser unusing
bloc de détruire l'objet lorsqu'il dépasse lausing
portée:Cela permettra de fermer correctement et éliminer le flux à travers toute exception des chemins.
StreamWriter(Stream, Encoding)
StreamWriter
wrapper est éliminé, il appelleClose()
sur le flux sous-jacent, ce qui implicitement dispose l'enfant du ruisseau.Il y a un constructeur pour le nom de fichier, appendMode, l'encodage.
Avec une bonne
using
bloc ça ressemble:Il y a un StreamWriter(chemin de la chaîne, booléen append, Encoding) constructeur - vous pouvez simplement spécifier explicitement l'ajout drapeau trop?
Je l'ai dit, vous devez emballer votre StreamWriter dans un
à l'aide de
trop, c'est à direbien que réaliste, cela ne fera aucune différence ici. Ce de mettre un try/finally autour du code, de sorte que le StreamWriter aurez nettoyé (il va appeler
sw.Dispose()
même si une exception est lancée dans l'intervalle. (Certaines personnes disent cela signifie également que vous n'avez plus besoin de la.Close
depuis le Jeter prendra soin de cela aussi, mais je préfère l'avoir de toute façon.)sw.Write
déclenche une exception. Il y a d'autres cas exceptionnels trop. Vous devriez TOUJOURS encapsuler n'importe quel code qui traiteIDisposable
objets dans unusing
outry/finally
. Vous devez également ne jamais appeler les deuxClose
etDispose
car il peut en résulter une double dispose, qui va jeter unObjectDisposedException
.Close()
méthode dispose de l'FileStream
. J'ai décompiléFileStream.Close()
de mscorlib et obtenu ceci:public virtual void Close() { Dispose(true); GC.SuppressFinalize(this); }
Voici le code complet: pastebin.com/n9d8TKnsDispose()
appelsClose()
, qui à son tour appelleDispose(true)
, qui fait le plein d'aliéner. Si vous permettre à Microsoft d'analyse de code, vous verrez qu'il lance un avertissement sur l'utilisation deClose()
ouDispose()
dans unusing
bloc, citant double-éliminer le problème. Et oui,StringBuilder.ToString()
méthode ne devrait pas lancer une exception, maisFileStream.Write()
plus pourrait sans aucun doute. C'est toujours les meilleures pratiques de disposer dans tous les exception des chemins.paramètre de codage UTF8 travail avec l'arabe de la police est la meilleure chose que j'ai fait: