DialogResult
とStringBuilder
を使用してファイルを保存しようとしています。テキストを作成した後、次のコードを呼び出してファイルを保存します。
if (dr == DialogResult.OK)
{
StreamWriter sw = new StreamWriter(saveFileDialog1.FileName);
sw.Write(sb.ToString());
sw.Close();
}
2番目のパラメーターをStreamWriter
にEncoding.UTF8
として追加しようとしましたが、最初の引数はstring
ではなくStream
であるため、コンパイルされません。
2番目のパラメーターをエンコードとして渡すことができるように、その文字列をストリームに変換するにはどうすればよいですか?
その理由は、テキストのどこかにµ
がありますが、ファイルを保存するとμ
のように表示されるため、µ
がねじ込まれているからです。
ありがとう
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());
}
_
これにより、すべての例外パスでストリームが適切に閉じられ、破棄されます。
Filename、appendMode、エンコーディングのコンストラクタがあります。
適切なusing
ブロックを使用すると、次のようになります。
if (dr == DialogResult.OK)
{
using (StreamWriter sw = new StreamWriter(saveFileDialog1.FileName,
false, Encoding.UTF8))
{
sw.Write(sb.ToString());
//sw.Close();
}
}
アラビア語フォントで動作するUTF8エンコーディングを設定することが、私がしたことの中で最高です。
using (var sw = new StreamWriter(
new FileStream(temporaryFilePath,
FileMode.Create,
FileAccess.ReadWrite),
Encoding.UTF8))
{
sw.Write(sb.ToString());
}
)
StreamWriter(string path、bool append、Encoding encoding) コンストラクタがあります-追加フラグも明示的に指定できますか?
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でも処理されるためです。