Подтвердить что ты не робот

Принуждение StreamWriter к изменению кодировки

Я пытаюсь сохранить файл с помощью DialogResult и StringBuilder. После создания текста я вызываю следующий код для сохранения файла:

    if (dr == DialogResult.OK)
    {

        StreamWriter sw = new StreamWriter(saveFileDialog1.FileName);

        sw.Write(sb.ToString());
        sw.Close();
    }

Я попытался добавить второй параметр в StreamWriter как Encoding.UTF8, но поскольку первый аргумент является string, а не Stream, он не компилирует его.

Как я могу преобразовать эту строку в поток, чтобы иметь возможность передать второй параметр в качестве кодировки?

Причиной этого является то, что где-то в моем тексте у меня есть µ, но когда файл сохраняется, он отображается как μ, поэтому µ получает завиток!

Спасибо

4b9b3361

Ответ 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());
            }
 )