Obligar a StreamWriter a cambiar la codificación

Obligar a StreamWriter a cambiar la codificación

Solo envuélvelo en un FileStream .

StreamWriter sw = new StreamWriter(
    new FileStream(saveFileDialog1.FileName, FileMode.Open, FileAccess.ReadWrite),
    Encoding.UTF8
);

Si desea agregar, use FileMode.Append en su lugar.

También debe llamar a Dispose() en un try/finally bloquear o usar un using bloque para desechar el objeto cuando excede el using alcance:

using(
    var sw = new StreamWriter(
        new FileStream(saveFileDialog1.FileName, FileMode.Open, FileAccess.ReadWrite),
        Encoding.UTF8
    )
)
{
    sw.Write(sb.ToString());
}

Esto cerrará y desechará correctamente los flujos en todas las rutas de excepción.

ACTUALIZACIÓN:

Según el comentario de JinThakur a continuación, hay una sobrecarga de constructor para StreamWriter que te permite hacer esto directamente:

var sw = new StreamWriter(saveFileDialog1.FileName, false, Encoding.UTF8);

El segundo parámetro especifica si el StreamWriter debe agregarse al archivo si existe, en lugar de truncarlo.


Hay un constructor para nombre de archivo, appendMode, codificación.

Con un using adecuado bloque parece:

if (dr == DialogResult.OK)
{
    using (StreamWriter sw = new StreamWriter(saveFileDialog1.FileName, 
           false, Encoding.UTF8))
    {
      sw.Write(sb.ToString());
      //sw.Close();
    }
}

Hay un constructor StreamWriter(string path, bool append, Encoding encoding) - ¿podría especificar explícitamente el indicador de agregar también?

Dije que deberías envolver tu StreamWriter en un using también, es decir,

if (dr == DialogResult.OK)
{
    using(StreamWriter sw = new StreamWriter(saveFileDialog1.FileName, false, Encoding.UTF8)) {
        sw.Write(sb.ToString());
        sw.Close();
    }
}

aunque siendo realistas esto no hará ninguna diferencia aquí. Esto pone efectivamente un intento/finalmente alrededor del código para que StreamWriter se limpie (llamará a sw.Dispose() incluso si se lanza una excepción mientras tanto. (Algunas personas dirán que esto también significa que ya no necesitas el .Close ya que Dispose también se encargará de eso, pero prefiero tenerlo de todos modos).