Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it L'avatar di M@LKAV
    Registrato dal
    Jan 2006
    Messaggi
    215

    [vb Net 2005] Errore di lettura file con classe StreamReader

    Ciao a tutti il problema con cui mi sto scannando è questo.

    Ho un applicazione di tipo console che controlla tramite la classe
    FileSystemWatcher i file che vengono creati in una cartella.
    Se i file sono di un certo tipo (in questo caso .dat)
    Leggo il file con una classe StreamReader e inserisco i dati in un database di Sqlserver.

    Tutto procede bene al di fuori di questo piccolo inconveniente.
    Ogni tanto la classe streamReader mi va in errore nelle lettura del file avvisandomi
    che il file è già in uso da un altro programma.!

    Al di fuori del tipico Try Catch per ovviare al problema è identificare l'errore in questione, mi serviva sapere se c'e il modo di aprire in maniera esclusiva un file oppure farlo rilasciare dal processo che lo stava utilizzando precedentemente.

    Se avete soluzioni alternative le ascolto volentieri.

    Grazie
    Malkav
    La mia pazzia continua a prosciugare la mia anima

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Manca il codice.

    Riporta la parte di codice che fa uso della classe StreamReader così possiamo valutare se è corretta oppure no.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it L'avatar di M@LKAV
    Registrato dal
    Jan 2006
    Messaggi
    215
    Posto il codice per l'accesso al file
    %
    Try
    Dim r As New IO.StreamReader(PathFile)




    While r.Peek <> -1

    console.writeline(r.readline())
    End While


    r.Close()


    Catch ex As IOException
    Console.WriteLine(ex.Message)
    End Try
    %
    La mia pazzia continua a prosciugare la mia anima

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da M@LKAV
    Posto il codice per l'accesso al file [...]
    Potrebbe essere ottimizzato, comunque sia pongo alcune domande che mi sembrano necessarie: dov'è contenuto questo codice? come/quando viene eseguito?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Utente di HTML.it L'avatar di M@LKAV
    Registrato dal
    Jan 2006
    Messaggi
    215
    Accetto consigli per ottimizzarlo questo e chiaro!

    Il codice postato è all'interno di una sub. (ReadDat)
    La sub a sua volta è all'interno di una classe FileReader dove ho inserito tutte le
    funzioni per la lettura dei vari tipi di file da importare nel database.

    Queste funzioni vengono richiamate all'interno di un di un altra classe
    Classe Watcher
    La classe in questione controlla tramite un filesystemwatcher se vengono creati dei file all'interno di una cartella.



    Riepilogando:

    Classe Watcher

    %
    Public Class Watcher

    Public watchfolder As FileSystemWatcher
    Public FileReader1 as Filereader1
    'in questa sub viene registrato se viene creato un file all'interno della cartella
    Private Sub logchange(ByVal source As Object, ByVal e As _
    System.IO.FileSystemEventArgs)

    If e.ChangeType = IO.WatcherChangeTypes.Created Then

    Dim fi As FileInfo = New FileInfo(e.FullPath)

    Console.WriteLine("E stato creato il file " & e.FullPath)


    'If fi.Extension = ".dat" Then

    filereader1 = new filereader()


    filereader1.ReadDat(e.fullpath)

    end if





    End If




    End Sub

    End Class

    %


    Classe FileReader



    %
    Public Class File Reader
    Public Sub ReadDat(ByVal PathFile As String)

    Try
    Dim r As New IO.StreamReader(PathFile)




    While r.Peek <> -1

    console.writeline(r.readline())
    End While


    r.Close()


    Catch ex As IOException
    Console.WriteLine(ex.Message)
    End Try

    End Sub
    End Class
    La mia pazzia continua a prosciugare la mia anima

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    A livello di ottimizzazione, io "proteggerei" il codice di lettura del file garantendo la sua chiusura anche in caso di errore; per esemplificare:

    codice:
    Dim r As New IO.StreamReader(PathFile)
    Try
    While r.Peek <> -1
      Console.WriteLine(r.ReadLine())
    End While
    Finally
      r.Close()
    End Try
    Nel tuo codice, invece, in caso di errore nella lettura del file, questo verrebbe chiuso solo quando il garbage collector passa a distruggere l'oggetto StreamReader che hai creato.

    Tralasciando questo aspetto, secondo me il problema che riscontri è dovuto alla "partenza" del tuo codice nel momento in cui il file da leggere si presenta, ma prima che questo sia stato completamente scritto e chiuso dalla routine che lo genera, segnalandoti l'errore che hai indicato.

    Forse dovresti adottare un accorgimento. Ad esempio, potresti attribuire un'estensione particolare al file in corso di scrittura e rinominarlo solo quando il processo è concluso, rendendolo quindi visibile all'applicazione che si occupa di prelevarlo.

    Fai eventualmente qualche prova specifica, magari scrivendo un file di dati molto corposo e provando a integrare il suggerimento sopra e vedere se il difetto si risolve.

    P.S.: usa il tag [CODE ] per formattare il codice!

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Utente di HTML.it L'avatar di M@LKAV
    Registrato dal
    Jan 2006
    Messaggi
    215
    Chiedo venia per il tag.. era tanto che non scrivevo sul forum e ricordavo di dover mettere
    il % per il codice.!

    Prima di tutto grazie per l'esempio che mi hai postato.
    Secondo il modo che mi hai descritto l'ho già usato è il risultato è ottimo ma mi interessava proprio approfondire il discorso dei diritti sul file.!
    Mi sai dare qualche suggerimento a riguardo?
    La mia pazzia continua a prosciugare la mia anima

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da M@LKAV
    Secondo il modo che mi hai descritto l'ho già usato è il risultato è ottimo ma mi interessava proprio approfondire il discorso dei diritti sul file.!
    Mi sai dare qualche suggerimento a riguardo?
    Cos'è che non ti è chiaro? :master:
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  9. #9
    Utente di HTML.it L'avatar di M@LKAV
    Registrato dal
    Jan 2006
    Messaggi
    215
    Originariamente inviato da alka
    Cos'è che non ti è chiaro? :master:

    mi è chiara la tua spiegazione è il tuo suggerimento ma in più volevo sapere se e possibile gestire il file controllandone l'accesso.

    I punti sono i seguenti.

    - Posso controllare se un file è già in uso (potresti dirmi che già l'eccezione mi dice se è utilizzato o meno...)
    - Posso controllare da che applicazione viene usato un file?
    - Posso aprire un file in maniera esclusiva da un applicazione?
    - Posso sganciare il file dall'applicazione che lo sta attualmente utilizzando?
    La mia pazzia continua a prosciugare la mia anima

  10. #10
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da M@LKAV
    - Posso controllare se un file è già in uso (potresti dirmi che già l'eccezione mi dice se è utilizzato o meno...)
    Infatti. Se ti viene sollevata l'eccezione specifica, allora significa che il file è in uso.
    Al massimo, puoi introdurre un meccanismo che, a fronte di questa condizione, ritenti in un secondo momento, dopo qualche istante di attesa, per un numero finito di volte.

    Originariamente inviato da M@LKAV
    - Posso controllare da che applicazione viene usato un file?
    Questo credo che richieda la chiamata di qualche funzione API specifica.
    Non conosco il procedimento e purtroppo non ho il tempo di ricercare, al momento.

    Originariamente inviato da M@LKAV
    - Posso aprire un file in maniera esclusiva da un applicazione?
    Sì. Ad esempio, quando usi l'oggetto FileStream, molti costruttori prevedono anche un parametro FileShare con cui puoi stabilire le possibilità di accesso da parte di altri programmi, in base all'utilizzo che fai dello stesso file.

    Originariamente inviato da M@LKAV
    - Posso sganciare il file dall'applicazione che lo sta attualmente utilizzando?
    Anche questo rientra nel contesto del controllo dell'applicazione che usa il file; onestamente però, rischieresti una perdita di dati, quindi meglio evitare nel contesto in cui ti trovi tu.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.