如何用StreamWriter完全覆盖文本文件?VB.NET切换功能写入异常求助
解决VB.NET文件写入时旧内容残留的问题
我明白你的问题了——当你切换写入"on"时,文件里会残留之前"off"的最后一个字符变成"onf",写入短内容时总会留下旧文件的剩余部分,这是因为你当前用的File.OpenOrCreate模式不会自动截断原有文件的长度。
问题根源
当你使用FileMode.OpenOrCreate打开一个已存在的文件时,文件的原有长度会被保留。如果新写入的内容长度比旧内容短,超出新内容长度的旧字节不会被清除,就会留在文件里。比如原来文件是3字节的"off",写入2字节的"on"后,最后一个字节的"f"依然存在,最终就变成了"onf"。
两种简洁的解决方案(无需删除重建文件)
方案一:手动截断文件长度
在打开文件流后,先调用SetLength(0)将文件长度重置为0,这样就能清空原有内容,再写入新内容就不会有残留了:
Private Sub PictureBox2_Click(sender As Object, e As EventArgs) Handles PictureBox2.Click Dim fStrm As FileStream = File.Open(muteFile, FileMode.OpenOrCreate) ' 截断文件,清空所有原有内容 fStrm.SetLength(0) Dim strmWrtr As StreamWriter = New StreamWriter(fStrm) If PictureBox2.Tag = "On" Then PictureBox2.Image = My.Resources.SoundOff PictureBox2.Tag = "Off" strmWrtr.Write("off") Else PictureBox2.Image = My.Resources.SoundOn PictureBox2.Tag = "On" strmWrtr.Write("on") End If strmWrtr.Close() fStrm.Close() End Sub
方案二:使用StreamWriter的自动覆盖模式(更简洁安全)
直接用StreamWriter的重载构造函数,指定append: False(这是默认值,可以省略),它会自动以覆盖模式打开文件,内部帮你处理截断操作。另外用Using语句还能自动关闭流,避免手动关闭的疏漏:
Private Sub PictureBox2_Click(sender As Object, e As EventArgs) Handles PictureBox2.Click Dim outputText As String If PictureBox2.Tag = "On" Then PictureBox2.Image = My.Resources.SoundOff PictureBox2.Tag = "Off" outputText = "off" Else PictureBox2.Image = My.Resources.SoundOn PictureBox2.Tag = "On" outputText = "on" End If ' Using语句会自动释放流资源,无需手动Close Using sw As New StreamWriter(muteFile, False) sw.Write(outputText) End Using End Sub
两种方案都能实现完全覆盖文件的效果,方案二更简洁且更符合.NET的最佳实践,推荐使用。
内容的提问来源于stack exchange,提问作者Tyler N
相关产品推荐
相关产品推荐

