Visual Basic“未处理的异常”

问题描述:

你好,我在尝试将序列号保存到XML文件时出现此错误。 如果该文件不存在,它将保存文件正常,但是如果我在Xml文件中将Registered tag更改为False,并再次尝试,则会显示“该进程无法访问该文件...因为它正在被另一个处理”。 在我的主要形式中,我从XML中读取信息,并在我的regform(如果在xml中注册标记为false,则打开它)我写入文件。是因为那个吗?!我不这么认为。 这里是我的注册类:Visual Basic“未处理的异常”

Imports System.IO 
    Imports System.Xml 

    Public Class RegistrationClass 
    Public Property SerialNumber As String 
    Public Property Registered As Boolean = False 
    Public Sub Write_Reg(ByVal FileString As String, ByVal RegisterName As String, ByVal   RegisterCompany As String, ByVal RegisterSerialNumber As String) 
     Dim Registered As Boolean = False 
     Dim Comment As String = "StroySoft 2012 Register Database" 
     Dim SerialNumber As String = "dev-xxx-123" 
     Dim ClientOS As String = Trim(My.Computer.Info.OSFullName) 
     If RegisterSerialNumber = SerialNumber Then 
      Dim settings As New XmlWriterSettings() 
      settings.Indent = True 

      ' Initialize the XmlWriter. 
      Dim XmlWrt As XmlWriter = XmlWriter.Create(FileString, settings) 

      With XmlWrt 

       ' Write the Xml declaration. 
       .WriteStartDocument() 

       ' Write a comment. 
       .WriteComment(Comment) 

       ' Write the root element. 
       .WriteStartElement("Data") 

       ' Start our first person. 
       .WriteStartElement("Register") 

       ' The person nodes. 

       .WriteStartElement("Name") 
       .WriteString(RegisterName.ToString()) 
       .WriteEndElement() 

       .WriteStartElement("Company") 
       .WriteString(RegisterCompany.ToString()) 
       .WriteEndElement() 

       .WriteStartElement("SerialNumber") 
       .WriteString(RegisterSerialNumber.ToString()) 
       .WriteEndElement() 

       Registered = True 
       .WriteStartElement("Registered") 
       .WriteString(Registered) 
       .WriteEndElement() 

       .WriteStartElement("ClientOS") 
       .WriteString(ClientOS) 
       .WriteEndElement() 

       ' The end of this person. 
       .WriteEndElement() 

       ' Close the XmlTextWriter. 
       .WriteEndDocument() 
       .Close() 
      End With 
      MsgBox("Успешна регистрация! Благодарим Ви!") 
      MainForm.РегистрацияToolStripMenuItem.Visible = False 
     Else 
     MsgBox("Невалиден сериен номер!") 
     End If 
    End Sub 
    Public Sub Check_Reg(ByVal FileString As String) 
     If (System.IO.File.Exists(FileString)) Then 

      Dim document As XmlReader = New XmlTextReader(RegForm.RegFile) 

      While (document.Read()) 

       Dim type = document.NodeType 

       If (type = XmlNodeType.Element) Then 

        If (document.Name = "Registered") Then 
         If document.ReadInnerXml.ToString() = "True" Then 
          Registered = True 
         Else 
          Registered = False 
         End If 

        End If 

        If (document.Name = "SerialNumber") Then 
         SerialNumber = document.ReadInnerXml.ToString() 
        End If 

       End If 

      End While 

     Else 

      MessageBox.Show("The filename you selected was not found.") 

     End If 
    End Sub 
End Class 

是不是因为这一点?我不这么认为。

正是因为如此。

您应该始终确保通过将它们包装在Using块中来妥善处置IDisposable资源,例如Streams和Writer/Readers。在你的情况下,我没有看到你关闭你的阅读器。但是如果你将它包装在Using块中,你不应该担心它。即使抛出异常,资源也会被正确释放。

例子:

Using XmlWrt As XmlWriter = XmlWriter.Create(FileString, settings) 
    ... 
End Using 

你应该做同样的XmlReader

Using document As XmlReader = XmlReader.Create(RegForm.RegFile) 
    ...  
End Using