File Input String – Codice VB.NET

File Input String : come prendere da un qualsiasi file una porzione di N byte da una sua qualsiasi posizione.

Introduzione

A molti programmatori, specie se alle prime armi, sarà capitato di voler leggere da un file solo N byte, posizionati in un punto X, specifico di esso: le classiche istruzioni lineinput o input non servono a molto. Ad esempio si potrebbe vole leggere solo i primi 1024 byte (l’intestazione del file) dove di solito sono contenute le informazioni dello stesso, oppure si è creato un file organizzato in X serie da N byte (i cosiddetti record): le applicazioni sono pressoché infinite. Si tratta quindi di un codice vbnet per il file input string.

[codesyntax lang=”vbnet”]

Imports System.IO

Public Function ingAC_INPUT_DA_FILE(Percorso_File As String,
                                        Posizione As Long,
                                        Buffer As Integer,
                                        Modalita_Errore As Boolean) As String
        ingAC_INPUT_DA_FILE = Nothing ' Nothing di default 
        If Not File.Exists(Percorso_File) Then
            If Modalita_Errore Then MsgBox("Errore 1: File inesistente.")
            Return Nothing ' file non esistente ritorna Nothing e ferma l'esecuzione
        Else
            Dim FLen As Long = FileLen(Percorso_File)
            If Buffer < 0 Or Buffer > FLen Then
                If Modalita_Errore Then MsgBox("Errore 2: Dimensioni del Buffer non corrette: min= 0, Max=dim File=" & FLen)
                Return Nothing ' errore dimensioni buffer ritorna Nothing e ferma l'esecuzione
            End If
            If Posizione < 0 Or Posizione * Buffer > FLen Then
                If Modalita_Errore Then MsgBox("Errore 3: La posizione va oltre i limiti consentiti: Attuale:" & Posizione * Buffer & "min= 0, max=dim File=" & FLen)
                Return Nothing ' errore posizionamento ritorna Nothing e ferma l'esecuzione
            End If
            Dim b(Buffer - 1) As Byte
            Try
                Using fs As FileStream = New FileStream(Percorso_File, FileMode.Open, FileAccess.Read)
                    Dim CountByte As Integer = Buffer
                    Dim OffsetByte As Integer = 0
                    While (CountByte > 0)
                        'Controlla se restituisce zero, nel qual caso smette di leggere
                        fs.Seek(Buffer * Posizione, 0)
                        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 Nothing ' errore durante il caricamento del file, ritorna Nothing e ferma l'esecuzione
            End Try
            If Posizione * Buffer + Buffer > FLen Then
                ReDim Preserve b(Buffer - (Posizione * Buffer + Buffer - FLen) - 1)
            End If
            Dim Conversion As String = System.Text.Encoding.UTF-8.GetString(b)
            Return Conversion
        End If
    End Function

[/codesyntax] 

Come funziona

La funzione ingAC_INPUT_DA_FILE(Percorso_File As String, Posizione As Long, Buffer As Integer, Modalita_Errore As Boolean) si occupa del file input string: basta inserire il Percorso_File che contiene percorso e nome del file insieme; poi immaginando di aver suddiviso idealmente il file in blocchi da N byte indichiamo tramite Posizione quale blocchettino si vuole leggere. Quindi Buffer indica la quantità di byte in cui è suddiviso il file e Posizione è la posizione del pacchetto di N byte. Con modalita_errore in True la funzione, se è il caso, avvisa con un msgbox del tipo di errore.

Il funzionamento è semplice, si effettuano i vari controlli preliminari e con seek ci si posiziona nel punto del file da cui si vuole iniziale la lettura; si procede col riempire il buffer. In output l’autore ha deciso di fare restituire una stringa contenente gli N byte letti dalla posizione X. Una nota: per la conversione da array di byte in string finale, si è usato System.Text.Encoding.UTF-8 che permette, secondo le esigenze di “encodare” anche in Unicode, Ascii, etc. Per cui il nostro file input string si può considerare bello e pronto.

Nota: ricordarsi di Imports System.IO in testa al listato, per poter usare la funzione ingAC_INPUT_DA_FILE().

Link utili:

File Input String - Codice VB.NET

You may also like...