2012-02-05 57 views
1

你好,我在嘗試將序列號保存到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 

回答

1

是不是因爲這一點?我不這麼認爲。

正是因爲如此。

您應該始終確保通過將它們包裝在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