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# 保存文件会删除我的部分文本的主要内容,如果未能解决你的问题,请参考以下文章