Questo sito utilizza cookie tecnici e di terze parti. Continuando la navigazione sul nostro sito accetti l'uso dei cookie. Per saperne di più leggi l'informativa sui cookie.   


Gestire un file sequenziale
Ultimo messaggio: 06 gen 2019 16:25 di Roberto57. 12 Risposte.
Stampa gradevole
Solo gli utenti registrati possono rispondere ad una discussione.
Avatar
Roberto57
Messaggi: 47
Iscritto dal: 08 set 2012 16:05
Utente
Utente

09 dic 2018 19:17

Buona sera, volevo chiedere un consiglio, sto realizzando un'applicazione di prova per gestire un file sequenziale, la lettura è perfetta, infatti il testo contenuto viene messo in un TextBox (TbxTesto), i problemi nascono quando eseguo le funzioni di scrittura o di cancellazione, in quanto la funzione rimane appesa per tanti secondi (troppi) ed alcune volte poi finisce regolarmente, altre volte la cancello.

Capisco che la domanda e l'esposizione è generica, ma dove potrei guardare per risolvere il problema?

Segue l'applicativo incriminato

Imports System.IO

'---------------------------------------------------------------------------------------------------------------------------------------------
' Applicazione di prova: Gestione testi su file sequenziale
'---------------------------------------------------------------------------------------------------------------------------------------------
Public Class Form1
Const fileSeq As String = "F:\VbasicMio\4 - Lavori VB\FileProvaSeq.txt"
Dim linee As New List(Of String)
Dim linea As String
Dim qtarec As Integer
Dim erro As Boolean

Private Sub BtnEsegui_Click(sender As Object, e As EventArgs) Handles BtnEsegui.Click

erro = False
qtarec = 0
LblMsg.Text = ""

If RbtLeggere.Checked = False And RbtScrivere.Checked = False And RbtDaZero.Checked = False And RbtCancellare.Checked = False Then
LblMsg.Text = "Obbligatorio selezionare l'operazione desiderata"
Exit Sub
End If

If RbtLeggere.Checked = True Then
Call LeggiFile()
If erro Then
Exit Sub
End If
Else
If RbtScrivere.Checked = True Then
Call ScriviFileAggiungendo()
If erro Then
Exit Sub
End If
Else
If RbtDaZero.Checked = True Then
Call ScriviFileDaZero()
If erro Then
Exit Sub
End If
Else
If RbtCancellare.Checked = True Then
Call CancellaFile()
If erro Then
Exit Sub
End If
End If
End If
End If
End If

End Sub

Private Sub LeggiFile()

TbxTesto.Text = ""
linea = ""
linee.Clear()

If Not IO.File.Exists(fileSeq) Then
erro = True
LblMsg.Text = "Il file " & fileSeq & " NON esiste - bisogna crearlo"
Exit Sub
End If

Using reader As New StreamReader(fileSeq)
linea = reader.ReadLine 'legge la prima linea
qtarec += 1
Do Until linea Is Nothing
linee.Add(linea)
linea = reader.ReadLine 'legge la linea successiva
qtarec += 1
Loop
reader.Close()
End Using

TbxTesto.Lines = linee.ToArray
LblMsg.Text = "Il file " & fileSeq & " è stato letto - è composto da " & qtarec - 1 & " records"
RbtLeggere.Checked = False

End Sub

Private Sub ScriviFileAggiungendo()

If TbxNuovo.TextLength < 1 Then
LblMsg.Text = "Il nuovo testo NON è stato digitato"
Exit Sub
End If

Try
Using writer As New StreamWriter(fileSeq, True)
writer.WriteLine(TbxNuovo.Text)
writer.Flush()
writer.Close()
End Using
Catch ex As Exception
LblMsg.Text = "Errore: " & ex.Message
End Try

LblMsg.Text = "Nel file " & fileSeq & " è stato aggiunto il nuovo testo digitato"
TbxNuovo.Text = ""
TbxTesto.Text = ""
linea = ""
RbtScrivere.Checked = False

End Sub

Private Sub ScriviFileDaZero()

If TbxNuovo.TextLength < 1 Then
LblMsg.Text = "Il nuovo testo NON è stato digitato"
Exit Sub
End If

Try
Using writer As New StreamWriter(fileSeq, False)
writer.WriteLine(TbxNuovo.Text)
writer.Flush()
writer.Close()
End Using
Catch ex As Exception
LblMsg.Text = "Errore: " & ex.Message
End Try

LblMsg.Text = "Nel file " & fileSeq & " è stato scritto il nuovo testo digitato, perdendo quello precedente"
TbxNuovo.Text = ""
TbxTesto.Text = ""
linea = ""
RbtDaZero.Checked = False

End Sub

Private Sub CancellaFile()
File.Delete(fileSeq)
LblMsg.Text = "Il file " & fileSeq & " è stato cancellato"
TbxTesto.Text = ""
RbtCancellare.Checked = False
End Sub

Private Sub RbtScrivere_CheckedChanged(sender As Object, e As EventArgs) Handles RbtScrivere.CheckedChanged
LblMsg.Text = "Scrivere il testo che verrà aggiunto a quello attuale"
TbxNuovo.Focus()
End Sub

Private Sub RbtDaZero_CheckedChanged(sender As Object, e As EventArgs) Handles RbtDaZero.CheckedChanged
LblMsg.Text = "Scrivere il testo che sostituirà quello attuale (i dati verranno persi)"
TbxNuovo.Focus()
End Sub
End Class
    Avatar
    Roberto57
    Messaggi: 47
    Iscritto dal: 08 set 2012 16:05
    Utente
    Utente

    15 dic 2018 14:43
    Buona giornata, volevo sapere se nessuno ha delle indicazioni per tentare di risolvere il problema da me segnalato nel post precedente.

    Cioè lettura di un file sequeziale OK, mentre scrittura e cancellazione durano troppo.

    Grazie.

      Avatar
      SirJo
      Messaggi: 2336
      Iscritto dal: 30 apr 2012 09:43
      Utente
      Utente

      15 dic 2018 15:42
      il codice che hai postato è molto lungo ed è difficile seguirlo e capire cosa stai facendo, perchè non posti solo le righe che non funzionano così riusciamo a capire meglio ??

        Avatar
        Roberto57
        Messaggi: 47
        Iscritto dal: 08 set 2012 16:05
        Utente
        Utente

        16 dic 2018 17:43

        Scusa avevo inserito icodice completo per far capire meglio il contesto.

        Comunque adesso ho inserito solo le 3 Sub che contengono le istruzioni interessate, nella fase di Debug (in VS) ci mettono molti millisecondi per essere eseguite, alcune volte cancello l'applicazione xchè non risponde più.

        --------------------------------------------------------------------------

        Private Sub ScriviFileAggiungendo()

        Try
        Using writer As New StreamWriter(fileSeq, True)
        writer.WriteLine(TbxNuovo.Text)
        writer.Flush()
        writer.Close()
        End Using
        Catch ex As Exception
        LblMsg.Text = "Errore: " & ex.Message
        End Try

        End Sub

        Private Sub ScriviFileDaZero()

        Try
        Using writer As New StreamWriter(fileSeq, False)
        writer.WriteLine(TbxNuovo.Text)
        writer.Flush()
        writer.Close()
        End Using
        Catch ex As Exception
        LblMsg.Text = "Errore: " & ex.Message
        End Try

        End Sub

        Private Sub CancellaFile()

        File.Delete(fileSeq)

        LblMsg.Text = "Il file " & fileSeq & " è stato cancellato"
        TbxTesto.Text = ""
        RbtCancellare.Checked = False
        End Sub
          Avatar
          SirJo
          Messaggi: 2336
          Iscritto dal: 30 apr 2012 09:43
          Utente
          Utente

          16 dic 2018 21:56
          invece che StreamWriter prova ad usare My.Computer.Filesystem
            Avatar
            Roberto57
            Messaggi: 47
            Iscritto dal: 08 set 2012 16:05
            Utente
            Utente

            18 dic 2018 17:50

            Ho provare ad utilizzare "My.Computer.FileSystem.OpenTextFileWriter" ma il risulato è lo stesso anche perchè viene comunque creato uno StreamWriter. Seguono le istruzioni:

            Private Sub ScriviFileAggiungendo()

            Dim fileWriter = My.Computer.FileSystem.OpenTextFileWriter(fileSeq, True)
            fileWriter.WriteLine(TbxNuovo.Text)
            fileWriter.Flush()            <----- qui
            fileWriter.Close()            <----- qui

            End Sub

            --------------------------------------

            I tempi di attesa sono molto lunghi in corrispondenti di tutte e due le istruzioni marcate con "qui", ho provato a spostare il file sequenziale nella stessa cartella dell'eseguibile ma il risultato non è cambiato.

              Avatar
              SirJo
              Messaggi: 2336
              Iscritto dal: 30 apr 2012 09:43
              Utente
              Utente

              18 dic 2018 22:21
              veramente io intendevo My.Computer.Filesystem.WriteAllText

              volevo anche capire di quanti byte stiamo parlando del file
                Avatar
                Roberto57
                Messaggi: 47
                Iscritto dal: 08 set 2012 16:05
                Utente
                Utente

                21 dic 2018 17:13
                Ho sostituito "My.Computer.FileSystem.OpenTextFileWriter" con "My.Computer.FileSystem.WriteAllText e le cose sono leggermente migliorate, nel senso che l'applicazione ci mette alcuni microsec in meno, però mi sembra ugualmente lenta.

                La quantità dei caratteri è di alcune centinaia.

                Comunque non capisco la lentezza nel scrivere e chiudere il file, che ho provato a mettere nella stessa cartella dell'eseguibile, ma l'esito è lo stesso.

                Hai qualche idea su cosa possa determinare una lunghezza cosi esagerata?

                  Avatar
                  SirJo
                  Messaggi: 2336
                  Iscritto dal: 30 apr 2012 09:43
                  Utente
                  Utente

                  23 dic 2018 15:33
                  prova questo codice, prima crea un file di 32kb, puoi aggiunge altri 32kb, a me ci mette 3 centesimi di secondo a fare la prima operazione, e poi altri 3 centesimi di secondo per la seconda operazione, mi sembra molto strano che da te ci metta tanto tempo

                  Lancia il programma e poi dicci che tempi hai di esecuzione

                          Dim bff As String = New String("k"c, 32768) ' creo una stringa di 32 KB

                          
                  ' scrivo il file completamente
                          
                  Dim start As Long = Date.Now.Ticks
                          
                  My.Computer.FileSystem.WriteAllText(My.Computer.FileSystem.SpecialDirectories.Desktop & "\test.txt", bff, False)
                          
                  Dim tempo = (Date.Now.Ticks - start) / TimeSpan.TicksPerSecond
                          
                  MessageBox.Show("Tempo creazione file: " & tempo.ToString("#0.00"))

                          
                  ' faccio l'append
                          start = 
                  Date.Now.Ticks
                          
                  My.Computer.FileSystem.WriteAllText(My.Computer.FileSystem.SpecialDirectories.Desktop & "\test.txt", bff, True)
                          tempo = (
                  Date.Now.Ticks - start) / TimeSpan.TicksPerSecond
                          
                  MessageBox.Show("Tempo append file: " & tempo.ToString("#0.00"))

                    Avatar
                    Diego Cattaruzza [exMVP]
                    Messaggi: 7167
                    Iscritto dal: 08 set 2012 12:22
                    Team
                    Team

                    31 dic 2018 16:25
                    Inviato da Roberto57 su 21 dic 2018 17:13
                    Ho sostituito "My.Computer.FileSystem.OpenTextFileWriter" con "My.Computer.FileSystem.WriteAllText e le cose sono leggermente migliorate, nel senso che l'applicazione ci mette alcuni microsec in meno, però mi sembra ugualmente lenta.

                    La quantità dei caratteri è di alcune centinaia.

                    Comunque non capisco la lentezza nel scrivere e chiudere il file, che ho provato a mettere nella stessa cartella dell'eseguibile, ma l'esito è lo stesso.

                    Hai qualche idea su cosa possa determinare una lunghezza cosi esagerata?

                     


                    Non è che stai leggendo e scrivendo contemporaneamente da 2 USB poste su uno stesso hub?

                      Diego Cattaruzza
                      ex MVP Visual Basic .Net
                      blog: Uncensured
                      Avatar
                      Roberto57
                      Messaggi: 47
                      Iscritto dal: 08 set 2012 16:05
                      Utente
                      Utente

                      01 gen 2019 18:35

                      Ho fatto la prova che mi ha richiesto sirJo ed i tempi sono pressochè uguali a quelli da Lui evidenziati.

                      Quindi ho provato a cambiare il disco su cui veniva scritto e letto il file, da F (disco rimovibile) a D partizione del disco fisso.

                      In effetti tutto funziona normalmente, cioè con tempi istantanei.

                      Non capisco cosa cambia da disco rimovibile (F) a disco fisso (D).

                      Non so se questa situazione a qualche attinenza con il discorso di Diego?

                       

                        Avatar
                        Diego Cattaruzza [exMVP]
                        Messaggi: 7167
                        Iscritto dal: 08 set 2012 12:22
                        Team
                        Team

                        02 gen 2019 08:57

                        Il 'discorso' è questo: se due risorse 'logiche' usano la stessa porta per operazioni di entrata-uscita (a esempio, due chiavette usb connesse ad un hub di porte usb a sua volta connesso a una sola porta usb del pc) presentano un ovvio problema di conflitti di precedenza tra operazioni di entrata e operazioni di uscita.

                        A parte ciò, è abbastanza normale che una chiavetta usb sia più lenta di un accesso a disco fisso, ma pare che nel tuo caso le differenze siano eccessive, ecco perché ho ipotizzato la situazione di un semplice 'casino' di collegamenti fisici.

                          Diego Cattaruzza
                          ex MVP Visual Basic .Net
                          blog: Uncensured
                          Avatar
                          Roberto57
                          Messaggi: 47
                          Iscritto dal: 08 set 2012 16:05
                          Utente
                          Utente

                          06 gen 2019 16:25
                          Scusa ma toglimi questo dubbio.

                          Può darsi che ci sia qualche casino sugli indirizzi, ma come mai la lettura del file viene effettuata con tempi di risposta normali (pochi millisec) mentre la funzione di srcittura ha dei tempi molto più lunghi?

                          Il file che uso è lo stesso e risiedeva (prima della modifica) su un disco rimovibile. 

                          Ciao e grazie.

                            Solo gli utenti registrati possono rispondere ad una discussione.