VB.NET保存XML文件时提示进程占用无法保存该如何解决?
问题原因
- 你代码中全局定义的
XmlReader对象xr提前打开了loginfo.xml文件,操作完成后没有释放文件句柄,导致后续保存操作无法获取文件读写权限 - 若之前运行过一次代码,
Process.Start("loginfo.xml")调用后系统默认关联的程序(如记事本、浏览器)会持续占用该文件,再次运行时也会触发占用错误
修复方案
- 所有操作XML文件的对象都用
Using语句包裹,执行完自动释放资源,无需手动关闭 - 不需要每次保存后都启动外部进程打开XML文件,直接用内存中已经加载的XML对象更新列表即可,避免二次读文件产生额外占用
- 不要用全局的
XmlReader长期持有文件句柄,每次读文件时临时创建、用完即毁 - 生成XML节点时建议用官方API创建,不要直接拼接字符串,避免用户输入特殊字符时生成非法XML
修正后的示例代码
Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click Dim addName As String = InputBox("Enter a name to add to student list") ' 过滤空输入避免生成无效节点 If String.IsNullOrWhiteSpace(addName) Then Exit Sub Dim doc As New XmlDocument() ' Using包裹文件流操作,执行完自动释放文件锁 Using fs As New FileStream("loginfo.xml", FileMode.Open, FileAccess.ReadWrite, FileShare.None) doc.Load(fs) Dim elmXML As XmlElement = doc.CreateElement("account") ' 用API创建节点避免特殊字符报错 Dim nameNode = doc.CreateElement("name") nameNode.InnerText = addName Dim passNode = doc.CreateElement("passcode") passNode.InnerText = "04MTH" elmXML.AppendChild(nameNode) elmXML.AppendChild(passNode) doc.DocumentElement.AppendChild(elmXML) ' 清空原有文件内容后保存新内容 fs.Position = 0 fs.SetLength(0) doc.Save(fs) End Using ' 直接用内存中的XML对象更新列表,不需要重新读文件 lbxStudent.Items.Clear() For Each accountNode As XmlNode In doc.SelectNodes("//name") lbxStudent.Items.Add(accountNode.InnerText) Next ' 调试需要打开XML文件再取消注释,日常运行建议去掉避免占用 ' Process.Start("loginfo.xml") End Sub
额外说明
如果运行时仍然报占用错误,检查一下是否有其他程序手动打开了loginfo.xml,关掉对应程序即可正常保存,不需要修改文件名。
内容的提问来源于stack exchange,提问作者J-grammer
相关产品推荐
相关产品推荐

