System.IO.IOException

di il
4 risposte

System.IO.IOException

Ho un programma che usa -tra l'altro- due files di testo, che vengono letti e scritti dopo che l'operatore ha effettuato alcune operazioni basilari (nuovo transazione, cancellazione operazione,ecc.).
Ricevo il seguente errore 'System.IO.IOException: 'Il processo non può accedere al file C:\AreaPersonale\VbNet2019\CC_4\bin\Debug\movimenti.txt' perché è in uso da un altro processo.'
Presumo che "l'altro processo" si riferisca e si attivi nella fase di lettura del file e che l'eccezione System.IO.IOException è generata nella fase di scrittura del file.
Come posso scoprire a quale processo si riferisce l'eccezione e comunque come posso risolvere il problema?
Grazie per qualsiasi soluzione/suggerimento.

    Private Sub ScriviMB_Click(sender As Object, e As EventArgs) Handles ScriviMB.Click
        Dim nomeFile As String = Application.StartupPath & "\movimenti.txt"
        Dim stringa As String

        For x As Integer = 0 To ListBox2.Items.Count - 1
            stringa += ListBox2.Items.Item(x) & Environment.NewLine
        Next

        For x As Integer = 0 To scartati.Length - 1
            Try
                stringa += scartati(x) & Environment.NewLine
                ListBox2.Items.Add(stringa)
            Catch ex As Exception
                Exit For
            End Try
        Next
        My.Computer.FileSystem.WriteAllText(nomeFile, stringa, False)
        contatore -= 1
    End Sub
    
    
    Private Sub LeggiMB_Click(sender As Object, e As EventArgs) Handles LeggiMB.Click
        contatore += 1
        Dim msaldo As Double
        Dim j As Integer = 0 : Dim y As Integer = 0
        ListBox2.SelectionMode = SelectionMode.MultiSimple
        Dim nomeFile As String = Application.StartupPath & "\movimenti.txt"
        If Not My.Computer.FileSystem.FileExists(nomeFile) Then
            letturaFile = False
            Exit Sub
        Else
            letturaFile = True
        End If
        Dim riga = My.Computer.FileSystem.OpenTextFileReader(nomeFile)
        Dim stringa As String = ""
        While Not riga.EndOfStream
            stringa = riga.ReadLine()
            If stringa.Contains(correntista.Text) Then          'se stringa contiene il correnista selezionato,
                ListBox2.Items.Add(stringa)                     'lo aggiungiamo alla listbox
                ListBox2.SetSelected(y, True)                   'selezioniamo l'item...
                y += 1
                msaldo += Val(Split(stringa, " | ")(3))         'calcoliamo la somma degli importi versati/prelevati
                saldo.Text = Format(msaldo, "n")
            Else
                scartati(j) = stringa
                j += 1
            End If
        End While
        ReDim Preserve scartati(j - 1)
    End Sub
    

4 Risposte

  • Re: System.IO.IOException

    Usa lo Using per la variabile [riga].
  • Re: System.IO.IOException

    Grazie,Sgrubak.Mi hai risolto una giornata vana al computer!!!
  • Re: System.IO.IOException

    Figurati!
  • Re: System.IO.IOException

    Jan ha scritto:


    Grazie,Sgrubak.Mi hai risolto una giornata vana al computer!!!
    Occhio che questa cosa si applica a una marea di altre classi, ad esempio pure sui DataReader.

    La motivazione è da ricondurre al fatto che stai usando una classe preposta alla gestione di una "risorsa" (un file aperto, un socket, uno spazio di memoria allocato, un bitmap, una connessione a DB, ecc.) e quindi devi garantire che tale risorsa venga rilasciata il prima possibile dopo l'uso, senza attendere l'intercessione del Garbage Collector, soprattutto se appena dopo devi operare con la medesima risorsa in altro modo (come avviene nel caso del file).

    Il costrutto Using, oppure un Try...Finally chiamando metodi come Close() o più genericamente Dispose() devo sempre essere chiamati in modo "garantito" (in presenza di eccezioni o meno).

    Studia l'interfaccia IDisposable per un approfondimento sulla tematica.

    Ciao!
Devi accedere o registrarti per scrivere nel forum
4 risposte