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();
    }
}

但是,当我打开文件时,里面的文本在某个地方被剪切,并且它的第二部分丢失了。(我断点了wText.Write(result.ToString());result.ToString()正如我所料 - 一个普通的文本。

然后我尝试放置wText.Write("Test?");并没有保存到文件中,但是文件本身出现了。

因此,无论我试图保存的文本有多短,我至少会丢失一些数据。

问题:我做错了什么?

PS我找到了这个例子并稍作修改以满足我的需要。

4

5 回答 5

4

内容可能未刷新。这很容易通过自己调用 Flush 或使用同时处理处置/关闭等的“使用”块来避免。

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

请注意这里没有任何 .Close() ......通过 using 块处理流读取器会为您解决这个问题,并确保它正确完成。

于 2012-06-06T13:34:54.120 回答
2

在 close() 之前调用 StreamWriter 上的 flush(),这会将输出缓冲区刷新到文件。或者直接在 streamwriter 上调用 close,这应该刷新 writer 并关闭底层流。如果需要,您可以将 AutoFlush 设置为 true,这可能会对性能产生影响。

于 2012-06-06T13:31:54.767 回答
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 回答
0

确保关闭 StreamWriter wText。您正在关闭底层流,但不是正在写入文件的 StreamWriter。调用StreamWriter.Close()还将为您关闭底层流。确保使用 try/finally 以确保在发生异常(例如 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 回答