Individuare in un file compilato .gambas gli eventuali file esterni in esso allegati
In linea generale, come ogni formato di file complesso anche i file con estensione .gambas (eseguibili e librerie Gambas) sono organizzati internamente in blocchi coerenti.
Dopo gli iniziali byte il primo blocco coerente di dati ha inizio sempre al 57° byte (indice 56).
Va precisato che il codice sorgente dei file, allegati nella cartella "Dati " dell'IDE di Gambas, viene salvaguardato per intero nei sorgenti dei file compilati .gambas . Pertanto tutti i dati dei file allegati al progetto vengono salvati in modo grezzo (senza alcun tipo di compressione) all'interno del corpo del file eseguibile .gambas, diventando ciascuno un blocco a sé stante.
Poiché l'ultima parte dei file .gambas contiene sia l'indicazione del byte ove inizia ciascun blocco, sia la rispettiva dimensione in byte, sono non solo facilmente individuabili l'inizio e la fine dei dati, ma sono anche leggibili tutti quei dati !
Mostriamo un semplice applicativo per l'individuazione del byte (indice) di inizio e della dimensione di ciascun blocco costituente un file avente estensione .gambas:
Private Const INIZIO_ULTIMO_BLOCCO As String = "\x2Estartup\x2Eproject" Private Const INIZIO_DATI_UTILI As String = "\x00\x00\x00\x00\x08\x00\x00\x00" Public Sub Main() Dim fl As File Dim nomefile, dati, ultimi As String Dim lung, posult, pos, dmn, n As Integer Dim bl As Byte nomefile = "/percorso/del/file.gambas" Print "File eseguibile: "; nomefile ' Apre in lettura il file con estensione ".gambas": fl = Open nomefile For Read ' Apprende la dimensione del file: lung = Lof(fl) Print "Dimensione totale: "; lung; " byte" Print ' Legge e carica in memoria tutti i dati del file ".gambas": Read #fl, dati, lung ' Riposiziona il puntatore interno del file all'indice zero: Seek #fl, 0 ' Individua la posizione dell'ultimo blocco di dati del file ".gambas": posult = InStr(dati, INIZIO_ULTIMO_BLOCCO) ' Prende in considerazione i soli dati dell'ultimo blocco: ultimi = Right(dati, Len(dati) - posult) ' Effettua un ulteriore filtro, lasciando i soli dati a noi utili: n = InStr(ultimi, INIZIO_DATI_UTILI) ' Calcola la posizione dei primi dati a noi utili: n += posult - 1 While True ' ...ὁ ἄπειρος κύκλος ! ' Sposta il puntatore interno del file in avanti: Seek #fl, n + 8 Read #fl, pos If pos < 0 Then n = Seek(fl) + 4 Else Inc bl Read #fl, dmn Print "Inizio "; bl; "° blocco al byte "; pos; " - dimensione: "; dmn; " byte" If Mid(dati, pos + dmn + 1, 16) = INIZIO_ULTIMO_BLOCCO Then Inc bl Print "Inizio "; bl; "° blocco al byte "; pos + dmn; " - dimensione: "; lung - (pos + dmn); " byte" Break Endif n = Seek(fl) Endif Wend fl.Close End