C#保存文件会删除部分文本

时间:2012-06-06 13:29:31

标签: c# save savefiledialog

我使用此代码保存我的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?");并且没有任何内容保存到文件中,但是文件本身就出现了。

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

问题:我做错了什么?

P.S。我找到了this示例并略微修改以满足我的需求。

5 个答案:

答案 0 :(得分: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块处理streamreader会为你完成这个,并确保它正确完成。

答案 1 :(得分:2)

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

答案 2 :(得分: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();
        }
    } 
} 

答案 3 :(得分:0)

您是否尝试过这种替代方法?

File.AppendAllText(path, result.ToString())

答案 4 :(得分: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());    
    }
  }
}