0

このコードを使用してxmlファイルを保存します。

SaveFileDialog saveFileDialog1 = new SaveFileDialog();
saveFileDialog1.DefaultExt = ".FFDATA";
saveFileDialog1.Filter = "Form|*.FFDATA";
saveFileDialog1.FileName = "A_"+code;//here code is a generated number, always unique

Stream myStream;

if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
    if ((myStream = saveFileDialog1.OpenFile()) != null)
    {
        StreamWriter wText = new StreamWriter(myStream);
        wText.Write(result.ToString());

        myStream.Close();
    }
}

しかし、ファイルを開くと、中のテキストがどこかで切り取られ、その2番目の部分が欠落しています。(私はブレークポイントを設定wText.Write(result.ToString());し、result.ToString()期待どおりです-通常のテキストです。

それから入れてみwText.Write("Test?");ましたが、ファイルに何も保存されませんでしたが、ファイル自体が表示されました。

したがって、保存しようとしているテキストがどれほど短くても、少なくとも一部のデータが欠落しています。

質問:私は何が間違っているのですか?

PSこの例を見つけて、ニーズに合わせて少し変更しました。

4

5 に答える 5

4

内容はおそらくフラッシュされていません。これは、自分でFlushを呼び出すか、破棄/クローズなども処理する「using」ブロックを使用することで簡単に回避できます。

using (StreamWriter wText = new StreamWriter(myStream))
{
  wText.Write(result.ToString());
  //wText.Flush(); //this should not be needed because close will flush
}

ここに.Close()がないことに注意してください... usingブロックを介してstreamreaderを破棄すると、それが自動的に処理され、正しく実行されていることを確認します。

于 2012-06-06T13:34:54.120 に答える
2

close()の前にStreamWriterでflush()を呼び出します。これにより、出力バッファがファイルにフラッシュされます。または、ストリームライターでcloseを直接呼び出します。これにより、ライターがフラッシュされ、基になるストリームが閉じられます。必要に応じて、AutoFlushをtrueに設定するだけで、パフォーマンスに影響を与える可能性があります。

于 2012-06-06T13:31:54.767 に答える
0

StreamWriterwTextを必ず閉じてください。基になるストリームを閉じていますが、ファイルに書き込んでいるStreamWriterは閉じていません。呼び出すStreamWriter.Close()と、基になるストリームも閉じられます。必ずtry/finalを使用して、例外(IOExceptionなど)が発生した場合にストリームが閉じられるようにしてください。次のコードで問題を解決できます。

SaveFileDialog saveFileDialog1 = new SaveFileDialog(); 
saveFileDialog1.DefaultExt = ".FFDATA"; 
saveFileDialog1.Filter = "Form|*.FFDATA"; 
saveFileDialog1.FileName = "A_"+code;//here code is a generated number, always unique 

Stream myStream;

if (saveFileDialog1.ShowDialog() == DialogResult.OK) 
{
    if ((myStream = saveFileDialog1.OpenFile()) != null) 
    {
        StreamWriter wText = new StreamWriter(myStream);
        try
        { 
            wText.Write(result.ToString()); 
        }
        // Close Stream and StreamWriter in a finally block so that they are
        // closed even if an exception occurs.
        finally
        {
            // StreamWriter.Close() will close the underlying Stream for you
            wText.Close();
        }
    } 
} 
于 2012-06-06T13:32:51.397 に答える
0

この代替アプローチを試しましたか?

File.AppendAllText(path, result.ToString())
于 2012-06-06T13:34:48.107 に答える
0

試す:

    StreamWriter wText = new StreamWriter(myStream); 
    wText.Write(result.ToString()); 
    wText.Close();
    myStream.Close(); 

または(より良い):

using (var myStream = saveFileDialog1.OpenFile())
{
  if (myStream != null)    
  {    
    using (var wText = new StreamWriter(myStream))
    {    
      wText.Write(result.ToString());    
    }
  }
}    
于 2012-06-06T13:38:28.603 に答える