Aprire File – Codice VB.NET

Aprire file: come fare a gestire e a leggere un certo numero di byte, da qualsiasi tipo di file.

Introduzione

Il listato seguente permette di aprire file di qualsiasi formato: testo, immagine, audio, pdf ecc. Per il programmatore potrebbe essere molto utile avere il codice già pronto e tale da gestire l’ apertura del file su cui effettuare le più svariate operazioni. Si potrebbe dover criptare/decriptare un file di testo; si potrebbe voler analizzare solo N byte che rappresentano ad esempio la temperatura dell’aria e cosi via…  In questo modo aprire file e gestirli diventa molto semplice.

Imports System.IO

Public Function ingAC_APRI_FILE(Percorso_File As String, Buffer As Integer, Modalita_Errore As Boolean) As Byte
        ingAC_APRI_FILE = 0 'di default tutto ok
        Dim LMax As Long = 2 ^ 24 ' 16MB : dimensione max matrice (piu grande = piu tempo)
        If Not File.Exists(Percorso_File) Then
            If Modalita_Errore Then MsgBox("Errore 1: File inesistente.")
            Return 1 ' file non esistente ritorna 1 e ferma l'esecuzione
        Else
            Dim FLen As Long = FileLen(Percorso_File)
            If Buffer < 0 Then
                If Modalita_Errore Then MsgBox("Errore 2: Il Buffer non può essere negativo.")
                Return 2 ' errore dimensioni buffer ritorna 2 e ferma l'esecuzione
            Else
                If Buffer = 0 And FLen < LMax Then Buffer = FLen ' buffer coincide con tutto il file
                If FLen > LMax Then
                    Buffer = LMax
                    ingAC_APRI_FILE = 3
                    If Modalita_Errore Then MsgBox("Errore 3: La lunghezza del file è maggiore del massimo consentito.") 'legge fino al max impostato, ritorna 3  e continua
                End If
            End If
            Try
                Using fs As FileStream = New FileStream(Percorso_File, FileMode.Open, FileAccess.Read)
                    Dim b(Buffer - 1) As Byte
                    Dim CountByte As Integer = Buffer
                    Dim OffsetByte As Integer = 0
                    While (CountByte > 0)
                        'Controlla se restituisce zero, nel qual caso smette di leggere
                        Dim n As Integer = fs.Read(b, OffsetByte, CountByte)
                        'Se n è zero termina il ciclo
                        If (n = 0) Then
                            Exit While
                        End If
                        OffsetByte = (OffsetByte + n)
                        CountByte = (CountByte - n)
                        Application.DoEvents()
                        'inserire qui dentro le operazioni da 
                        'effettuare durante il caricamento in b
                        'ad esempio un indicatore di avanzamento
                    End While
                    CountByte = b.Length
                End Using
            Catch ex As Exception
                If Modalita_Errore Then MsgBox("Errore 4: " & ex.Message)
                Return 4 ' errore durante il caricamento del file, ritorna 4 e ferma l'esecuzione
            End Try
        End If
    End Function

Come funziona

Il funzionamento è semplice. La funzione che si occupa di tutto è ingAC_APRI_FILE(Percorso_File As String, Buffer As Integer, Modalita_Errore As Boolean) che ha come ingresso il Percorso_File e la dimensione del Buffer (ossia quanti byte alla volta si vogliono leggere/analizzare). Con modalita_errore in True la funzione in caso di errore avvisa con un msgbox dell’errore.

Come output restituisce un valore numerico positivo, corrispondente a un eventuale errore; oppure zero se è tutto ok. Ovviamente si potrebbe voler far restituire alla funzione una stringa esplicativa oppure direttamente il risultato delle operazioni condotte sui file.

Di default la funzione restituirà il valore “zero” a meno che, effettuato il primo controllo “if”, il file non sia presente: in questo caso verrà restituito il valore “1”. Se è tutto ok il codice prosegue controllando che il buffer dato in input non sia minore o uguale a zero oppure che non sia troppo grande. Il valore di 16MB sembra adeguato come massimo, ma potrebbe anche essere aumentato o diminuito.

Nel caso in cui sia possibile, ponendo in input “Buffer”=0, lo si farà coincidere con la dimensione del file, oppure con il valore massimo impostato a 16MB. In quest’ultimo caso la funzione restituirà, salvo altri errori, il valore “3”. A questo punto, all’interno di un Try-Catch-End Try, al fine di prevenire tutti gli errori possibili, si procede con l’apertura del file in questione (i vari parametri da inserire/modificare li trovate su MSDN) e con un Do While – Loop si procede alla lettura di “Buffer” byte.

Terminato il loop senza errori, si avrà l’array “b” riempito con i byte del file impostati con “buffer”; viceversa la funzione restituirà “4”. Questo array “b” potrà quindi essere copiato in un altro array, magari pubblico, sul quale operare agevolmente da ogni parte del listato del vostro progetto. Una modifica interessante potrebbe essere quella di gestire e caricare una serie di N byte per volta, avanzando fino alla fine del file.

Infine, ricordate di inserire Imports System.IO per poter usare la funzione ingAC_APRI_FILE ().

Link utili:

You may also like...