c# - Obligando a StreamWriter a cambiar la codificación
stringbuilder (4)
Estoy intentando guardar un archivo usando DialogResult
y StringBuilder
. Después de hacer el texto, estoy llamando al siguiente código para guardar el archivo:
if (dr == DialogResult.OK)
{
StreamWriter sw = new StreamWriter(saveFileDialog1.FileName);
sw.Write(sb.ToString());
sw.Close();
}
Intenté agregar el segundo parámetro a StreamWriter
como Encoding.UTF8
pero como el primer argumento es una string
lugar de una Stream
, no la compila.
¿Cómo puedo convertir esa cadena en un flujo para poder pasar el segundo parámetro como codificación?
La razón de esto, es que en alguna parte de mi texto tengo µ
pero cuando se guarda el archivo, se muestra como μ
así que µ
se está desquiciando!
Gracias
Existe un constructor StreamWriter (ruta de cadena, apéndice bool, codificación de codificación) . ¿Podría simplemente especificar explícitamente el indicador de anexión 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 de manera realista esto no hará ninguna diferencia aquí. Esto efectivamente pone a prueba / finalmente el código para que el StreamWriter se limpie (llamará sw.Dispose()
incluso si se sw.Dispose()
una excepción entretanto. (Algunas personas dirán que esto también significa que ya no es necesario el .Close
ya que el Dispose se encargará de eso también, pero prefiero tenerlo de todos modos.)
Hay un constructor para nombre de archivo, appendMode, codificación.
Con un bloque de using
adecuado parece:
if (dr == DialogResult.OK)
{
using (StreamWriter sw = new StreamWriter(saveFileDialog1.FileName,
false, Encoding.UTF8))
{
sw.Write(sb.ToString());
//sw.Close();
}
}
Sólo envuélvalo en un FileStream
.
StreamWriter sw = new StreamWriter(
new FileStream(saveFileDialog1.FileName, FileMode.Open, FileAccess.ReadWrite),
Encoding.UTF8
);
Si desea adjuntar, use FileMode.Append
en FileMode.Append
lugar.
También debe llamar a Dispose()
en un bloque try/finally
, o usar un bloque using
para eliminar el objeto cuando excede el alcance de using
:
using(
var sw = new StreamWriter(
new FileStream(saveFileDialog1.FileName, FileMode.Open, FileAccess.ReadWrite),
Encoding.UTF8
)
)
{
sw.Write(sb.ToString());
}
Esto cerrará correctamente y eliminará las secuencias en todas las rutas de excepción.
establecer la codificación UTF8 trabajando con fuente árabe es lo mejor que hice:
using (var sw = new StreamWriter(
new FileStream(temporaryFilePath,
FileMode.Create,
FileAccess.ReadWrite),
Encoding.UTF8))
{
sw.Write(sb.ToString());
}
)