Forzar a StreamWriter a cambiar la codificación
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();
}
Traté de agregar el segundo parámetro a StreamWriter
como Encoding.UTF8
pero como el primer argumento es un string
en lugar de un Stream
, no lo 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 algún lugar de mi texto tengo µ
pero cuando el archivo es guardado se muestra como {[8] } por lo que el µ
está recibiendo screwd!
Gracias
4 answers
Simplemente envuélvalo 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 bloque try/finally
, o usar un bloque using
para eliminar el objeto cuando exceda el alcance using
:
using(
var sw = new StreamWriter(
new FileStream(saveFileDialog1.FileName, FileMode.Open, FileAccess.ReadWrite),
Encoding.UTF8
)
)
{
sw.Write(sb.ToString());
}
Esto cerrará y eliminará correctamente los flujos a través de todas las rutas de excepción.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-16 12:14:21
Hay un constructor para filename, appendMode, encoding.
Con un bloque apropiado using
se ve como:
if (dr == DialogResult.OK)
{
using (StreamWriter sw = new StreamWriter(saveFileDialog1.FileName,
false, Encoding.UTF8))
{
sw.Write(sb.ToString());
//sw.Close();
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-16 12:20:01
Hay un constructor StreamWriter(string path, bool append, Encoding encoding) - ¿podría especificar explícitamente el indicador append 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 realista esto no hará ninguna diferencia aquí. Esto efectivamente pone un try / finally alrededor del código para que el StreamWriter se limpie (llamará sw.Dispose()
incluso si se lanza una excepción mientras tanto. (Algunas personas dirá que esto también significa que ya no necesita el .Close
ya que la Disposición se encargará de eso también, pero prefiero tenerlo de todos modos.)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-16 12:18:20
Establecer la codificación UTF8 trabajar 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());
}
)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-09 07:57:17