我正在尝试使用DialogResult
和StringBuilder
保存文件。在制作文本后,我调用以下代码来保存文件:
if (dr == DialogResult.OK)
{
StreamWriter sw = new StreamWriter(saveFileDialog1.FileName);
sw.Write(sb.ToString());
sw.Close();
}
我尝试将第二个参数添加到StreamWriter
Encoding.UTF8
,但由于第一个参数是string
而不是Stream
,因此它不会编译它。< / p>
如何将该字符串转换为流,以便能够将第二个参数作为编码传递?
原因在于,我的文字中有µ
,但文件保存后显示为μ
,因此µ
被搞砸了!
由于
答案 0 :(得分:47)
将其包装在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());
}
这将正确关闭并在所有异常路径中处理流。
答案 1 :(得分:12)
有一个构造函数,用于filename,appendMode,encoding。
使用正确的using
块看起来像:
if (dr == DialogResult.OK)
{
using (StreamWriter sw = new StreamWriter(saveFileDialog1.FileName,
false, Encoding.UTF8))
{
sw.Write(sb.ToString());
//sw.Close();
}
}
答案 2 :(得分:2)
有一个StreamWriter(string path, bool append, Encoding encoding)构造函数 - 你也可以显式指定append标志吗?
我说你应该将你的StreamWriter包装在using
中,即
if (dr == DialogResult.OK)
{
using(StreamWriter sw = new StreamWriter(saveFileDialog1.FileName, false, Encoding.UTF8)) {
sw.Write(sb.ToString());
sw.Close();
}
}
虽然实际上这不会有任何区别。这有效地在代码周围进行了try / finally,以便StreamWriter得到清理(即使在此期间抛出异常,它也会调用sw.Dispose()
。(有些人会说这也意味着你不再需要.Close
因为Dispose也会处理这个问题,但无论如何我更愿意接受它。)
答案 3 :(得分:2)
设置使用阿拉伯字体的UTF8编码是我做过的最好的事情:
using (var sw = new StreamWriter(
new FileStream(temporaryFilePath,
FileMode.Create,
FileAccess.ReadWrite),
Encoding.UTF8))
{
sw.Write(sb.ToString());
}
)
答案 4 :(得分:0)
最简单的方法是使用正确的构造函数。
StreamWriter(String, Boolean, Encoding)
使用指定的编码和默认缓冲区大小为指定的文件初始化StreamWriter类的新实例。如果文件存在,则可以将其覆盖或附加。如果该文件不存在,则此构造方法将创建一个新文件。
C#
public StreamWriter (string path, bool append, System.Text.Encoding encoding);