Devfly
Devfly

Reputation: 2495

Visual basic "Unhandled exception"

Hello I'm getting this error, while trying to save serial number to XML File. If the file doesn't exist, it saves the file fine, but if i change Registered tag to False in Xml file, and try again, it says "The Process Cannot acces the file ... because it is being used by another process". In my main form i read the information from XML, and in my regform (which i open if registered tag in xml is false) i write to the file. is it because of that?! I don't think so. Here is my Registration class:

    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

Upvotes: 1

Views: 729

Answers (1)

Darin Dimitrov
Darin Dimitrov

Reputation: 1038930

is it because of that?! I don't think so.

It's exactly because of that.

You should always make sure to properly dispose IDisposable resources such as Streams and Writers/Readers by wrapping them in a Using block. In your case I don't see you closing your reader. But if you wrap it in a Using block you shouldn't worry about it. Even if an exception is thrown the resource will be properly released.

Example:

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

You should do the same with your XmlReader:

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

Upvotes: 1

Related Questions