Принуждение StreamWriter к изменению кодировки
Я пытаюсь сохранить файл с помощью DialogResult
и StringBuilder
. После создания текста я вызываю следующий код для сохранения файла:
if (dr == DialogResult.OK)
{
StreamWriter sw = new StreamWriter(saveFileDialog1.FileName);
sw.Write(sb.ToString());
sw.Close();
}
Я попытался добавить второй параметр в StreamWriter
как Encoding.UTF8
, но поскольку первый аргумент является string
, а не Stream
, он не компилирует его.
Как я могу преобразовать эту строку в поток, чтобы иметь возможность передать второй параметр в качестве кодировки?
Причиной этого является то, что где-то в моем тексте у меня есть µ
, но когда файл сохраняется, он отображается как μ
, поэтому µ
получает завиток!
Спасибо
Ответы
Ответ 1
Просто оберните его в FileStream
.
StreamWriter sw = new StreamWriter(
new FileStream(saveFileDialog1.FileName, FileMode.Open, FileAccess.ReadWrite),
Encoding.UTF8
);
Если вы хотите добавить, используйте FileMode.Append
вместо этого.
Вы также должны вызвать Dispose()
в блоке try/finally
или использовать блок using
для размещения объекта, когда он превышает область using
:
using(
var sw = new StreamWriter(
new FileStream(saveFileDialog1.FileName, FileMode.Open, FileAccess.ReadWrite),
Encoding.UTF8
)
)
{
sw.Write(sb.ToString());
}
Это правильно закроет и удалит потоки по всем путям исключений.
Ответ 2
Существует конструктор для имени файла, appendMode, encoding.
При правильном блоке using
это выглядит так:
if (dr == DialogResult.OK)
{
using (StreamWriter sw = new StreamWriter(saveFileDialog1.FileName,
false, Encoding.UTF8))
{
sw.Write(sb.ToString());
//sw.Close();
}
}
Ответ 3
Существует StreamWriter (string path, bool append, Encoding encoding) constructor - вы можете просто явно указать флаг append?
Я сказал, что вы должны обернуть свой StreamWriter в using
, т.е.
if (dr == DialogResult.OK)
{
using(StreamWriter sw = new StreamWriter(saveFileDialog1.FileName, false, Encoding.UTF8)) {
sw.Write(sb.ToString());
sw.Close();
}
}
хотя это реально не будет иметь никакого значения. Это эффективно ставит попытку/наконец вокруг кода, чтобы StreamWriter очистился (он будет вызывать sw.Dispose()
, даже если в это время будет выбрано исключение. (Некоторые люди скажут это, также означает, что вам больше не понадобится .Close
, так как Dispose позаботится об этом тоже, но я предпочитаю его в любом случае.)
Ответ 4
настройка кодировки UTF8, работающая с арабским шрифтом, - лучшее, что я сделал:
using (var sw = new StreamWriter(
new FileStream(temporaryFilePath,
FileMode.Create,
FileAccess.ReadWrite),
Encoding.UTF8))
{
sw.Write(sb.ToString());
}
)