2012-02-05 4 views
1

안녕하세요 XML 파일에 일련 번호를 저장하는 동안이 오류가 발생합니다. 파일이 없으면 파일을 잘 저장하지만 Xml 파일에서 등록 된 태그를 False로 변경하고 다시 시도하면 "다른 사람이 파일을 사용하고 있기 때문에 프로세스가 파일에 액세스 할 수 없습니다. 방법". 내 주요 양식에서 XML에서 정보를 읽고 내 등록 (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

입니다! 나는 그렇게 생각하지 않는다.

정확히 그 때문입니다.

Streams 및 Writers/Readers와 같은 IDisposable 리소스를 Using 블록으로 래핑하여 올바르게 처리해야합니다. 당신의 경우 독자를 닫는 것을 보지 못합니다. 그러나 Using 블록에서 래핑하면 걱정할 필요가 없습니다. 예외가 발생하더라도 리소스는 제대로 릴리스됩니다.

예 :와

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

당신은 동일한 작업을 수행해야 당신의 XmlReader :

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