Gestione dei files binari
La gestione dei files binari è molto simile alla gestione dei files casuali: i metodi per l’accesso al file sono gli stessi ma vengono utilizzati in modi leggermente differenti.
Un file binario solitamente contiene informazioni di lughezza variabile. Chiariamo meglio il concetto con un esempio.
Un file di tipo bitmap contiene una serie di bytes che ne identificano il formato, un header che mantiene le informazioni sulla risoluzione, il numero di colori ed altre informazioni di formato e poi contiene una sequenza di bytes che costituiscono l’immagine (vogliate scusarmi se ho sintetizzato in modo così semplicistico il formato bitmap). Con un accesso casuale siamo obbligati a definire un record di dimensione fissa: 2 bytes, 10 bytes, 200bytes ma non possiamo variare questa dimensione di volta in volta. Con un file ad accesso sequenziale, potremmo leggere un intera riga fino al carattere di ritorno a capo (costante vbCRLF), oppure fino alla virgola (ma non sarebbe utile al caso nostro), ma non possiamo indicare la lunghezza della stringa da leggere di volta in volta per cui si ricorre al metodo di accesso binario.
L’apertura di un file ad accesso binario è determianto dalla seguente istruzione Open:
Dim NomeLogico as Integer Dim NomeFisico as Integer NomeLogico = FreeFile NomeFisico = "c:\Esempio\immagine.bmp" Open NomeFisico For Binary Access Read Lock Write As NomeLogico
Come notate a differenza del metodo ad accesso casuale non è stata specificata la lunghezza del record da leggere. Questo perchè lo definiremo di volta in volta in base all’informazione da leggere. Ipotizziamo di avere il seguente tracciato record per il file:
Informazione posizione lunghezza -------------+------------+------------ Cognome | 1 | 30 Nome | 31 | 20 Eta | 51 | 3 Sesso | 54 | 1 Barba | 55 | 1 -------------+------------+------------
Rendendo la cosa più complessa se il sesso corrisponde a M esiste l’informazione Barba nel record altrimenti il record sarà lungo un byte in meno.
Per leggere da un file binario, bisonga determinare la lunghezza del buffer da leggere riempiendo il buffer del numero di caratteri che si vuole leggere.
Per cui la lettura del (primo record dal ) tracciato record indicato sarà il seguente:
Dim NomeLogico as Integer Dim NomeFisico as Integer Dim Buffer as String NomeLogico = FreeFile NomeFisico = "c:\Esempio\immagine.bmp" Open NomeFisico For Binary Access Read Lock Write As NomeLogico ' Leggo il Cognome Buffer = Space$(30) Posizione = 1 Get NomeLogico, Posizione, Buffer ' Leggo il Nome Posizione = Posizione + 30 Buffer = Space$(20) Get NomeLogico, Posizione, Buffer ' Leggo il Eta Posizione = Posizione + 20 Buffer = Space$(20) Get NomeLogico, Posizione, Buffer ' Leggo il Sesso Posizione = Posizione + 3 Buffer = Space$(1) Get NomeLogico, Posizione, Buffer If(Buffer="M") then ' Leggo se ha la barba solo se è di sesso Maschile (M) Posizione = Posizione + 1 Buffer = Space$(1) Get NomeLogico, Posizione, Buffer End If ...
La scrittura in un file ad accesso binario è regolata dalle stesse modalità di un file ad accesso casuale.
Conclusioni
Questo articolo era stato scritto inizialmente per VBProgrammer un sito che curavo diversi anni fa. Oggi ho voluto riprendere l’articolo e renderlo più ricco rispetto alla sua forma iniziale.
Buona programmazione a tutti!
Una piccola nota storica
La prima volta che ho pubblicato questo articolo è stato nel Giugno 2002 su un sito da me prodotto che trattava di Visual Basic. Successivamente lo avevo riportato anche nella vecchia versione del sito diegolamonica.info. Per memoria storica e, poichè è stato il mio primo articolo pubblicato sul Web, ho deciso di riportarlo tra queste pagine.