J'essaie d'enregistrer un fichier à l'aide de DialogResult
et StringBuilder
. Après avoir fait le texte, j'appelle 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 comme le premier argument est un string
plutôt qu'un Stream
, il ne le compile pas.
Comment puis-je convertir cette chaîne en un flux pour pouvoir passer le deuxième paramètre en tant qu'encodage?
La raison en est que quelque part dans mon texte, j'ai µ
mais lorsque le fichier est enregistré, il apparaît comme μ
alors le µ
devient foutu!
Merci
Il suffit de l'envelopper dans un FileStream
.
StreamWriter sw = new StreamWriter(
new FileStream(saveFileDialog1.FileName, FileMode.Open, FileAccess.ReadWrite),
Encoding.UTF8
);
Si vous souhaitez ajouter, utilisez plutôt FileMode.Append
.
Vous devez également appeler Dispose()
sur un bloc try/finally
, Ou utiliser un bloc using
pour supprimer l'objet lorsqu'il dépasse la portée using
:
using(
var sw = new StreamWriter(
new FileStream(saveFileDialog1.FileName, FileMode.Open, FileAccess.ReadWrite),
Encoding.UTF8
)
)
{
sw.Write(sb.ToString());
}
Cela fermera et éliminera correctement les flux sur tous les chemins d'exception.
Il existe un constructeur pour le nom de fichier, appendMode, encodage.
Avec un bloc using
approprié, cela ressemble à:
if (dr == DialogResult.OK)
{
using (StreamWriter sw = new StreamWriter(saveFileDialog1.FileName,
false, Encoding.UTF8))
{
sw.Write(sb.ToString());
//sw.Close();
}
}
définir l'encodage UTF8 en utilisant la police arabe est la meilleure chose que j'ai faite:
using (var sw = new StreamWriter(
new FileStream(temporaryFilePath,
FileMode.Create,
FileAccess.ReadWrite),
Encoding.UTF8))
{
sw.Write(sb.ToString());
}
)
Il y a un constructeur StreamWriter (chemin de chaîne, ajout booléen, encodage d'encodage) - vous pouvez simplement spécifier explicitement l'indicateur d'ajout aussi?
J'ai dit que vous devriez également envelopper votre StreamWriter dans un using
, c'est-à-dire.
if (dr == DialogResult.OK)
{
using(StreamWriter sw = new StreamWriter(saveFileDialog1.FileName, false, Encoding.UTF8)) {
sw.Write(sb.ToString());
sw.Close();
}
}
bien qu'en réalité cela ne fasse aucune différence ici. Cela met effectivement un essai/enfin autour du code afin que StreamWriter soit nettoyé (il appellera sw.Dispose()
même si une exception est levée entre-temps. (Certaines personnes diront que cela signifie également que vous ne plus besoin du .Close
puisque Dispose s'en chargera aussi mais je préfère l'avoir quand même.)