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

Posted

技术标签:

【中文标题】C# 保存文件会删除我的部分文本【英文标题】:C# saving file cuts away part of my text 【发布时间】:2012-06-06 13:29:30 【问题描述】:

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

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

问题:我做错了什么?

附:我找到了this 示例并稍作修改以满足我的需要。

【问题讨论】:

使用using 永远是你的朋友... 使用using 使用什么? 关于流和流写入器。 【参考方案1】:

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

using (StreamWriter wText = new StreamWriter(myStream))

  wText.Write(result.ToString());
  //wText.Flush(); //this should not be needed because close will flush

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

试试:

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

【讨论】:

【参考方案5】:

确保关闭 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();
        
     
 

【讨论】:

以上是关于C# 保存文件会删除我的部分文本的主要内容,如果未能解决你的问题,请参考以下文章

C# 保存文件 - (删除并重写?)

如何从字符串中删除最后一个字符

如何从 .CSV 文件中删除不合适的行并使用 C# 再次保存该文件?

c#将文件保存到桌面

隐藏或保护 .txt 保存数据 c#

C# 将 DataGridView 保存到文本文件