web-dev-qa-db-fra.com

Forcer StreamWriter à changer l'encodage

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

28
Saeid Yazdani

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.

47
Polynomial

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();
    }
}
12
Henk Holterman

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());
            }
 )
2
Akif Irshad

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.)

2
Rup