Individuare in un file compilato .gambas gli eventuali file esterni in esso allegati

Da Gambas-it.org - Wikipedia.

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