Search code examples
c#stringbuilderstreamwriter

Forcing StreamWriter to change Encoding


I am trying to save a file using DialogResult and StringBuilder. After making the text, I am calling the following code to save the file:

    if (dr == DialogResult.OK)
    {

        StreamWriter sw = new StreamWriter(saveFileDialog1.FileName);

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

I tried to add the second parameter to StreamWriter as Encoding.UTF8 but since the first argument is a string rather than a Stream, it does not compile it.

How can I convert that string to a stream to be able to pass the second parameter as Encoding?

The reason for this, is that somewhere in my text I have µ but when the file is saved it shows like μ so the µ is getting screwd!

Thanks


Solution

  • Just wrap it in a FileStream.

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

    If you want to append, use FileMode.Append instead.

    You should also call Dispose() on a try/finally block, or use a using block to dispose the object when it exceeds the using scope:

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

    This will properly close and dispose the streams across all exception paths.

    UPDATE:

    As per JinThakur's comment below, there is a constructor overload for StreamWriter that lets you do this directly:

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

    The second parameter specifies whether the StreamWriter should append to the file if it exists, rather than truncating it.