...suppongo che ci siano soluzioni più "raffinate", o sbaglio?
A mio modestissimo parere, nel momento in cui usi specifiche funzioni
all'uopo preposte, adotti già una metodologia "raffinata". Dunque fra due previste e legittime soluzioni, si pone una duplice questione:
* che tipo di dati ti servono da manipolare successivamente ? Tipo
Byte ? Tipo
Stringa ?
* è necessaria la velocità nell'apertura del file ?
Avrei bisogno di aprire dei files,
Tenuto conto che devi aprire dei pesantissimi file, la risposta alla seconda domanda mi pare sia positiva. Ebbene da quel che ho potuto sempre notare, l'apertura di un file con il metodo
.Load della Classe
File, è molto veloce, e ben più veloce della modalità di
assunzione dei dati mediante un ciclo dopo aver aperto il file con l'istruzione
Open.... For Read.
Ti riporto un test di velocità che ho fatto (i valori temporali sono condizionati dalla capacità del mio PC, ma chiaramente ciò che importa è il confronto fra i tre test) mediante un file di 40 megabyte:
* modalità
Open.... For Read + ciclo While...Wend (raccolta dati di tipo
Byte):
Public Sub Form_Open()
Dim fl As File
Dim b As Byte
fl = Open "/percorso/del/file" For Read
While Not Eof(fl)
Read #fl, b
Wend
fl.Close
End
ha impiegato
7602 millisecondi;
* modalità
File.Load() (raccolta dati tipo
Stringa):
Public Sub Form_Open()
Dim s As String
s = File.Load("/percorso/del/file")
End
ha impiegato
451 millisecondi;
* modalità
Open.... For Read + sola istruzione Read
a lunghezza fissa (raccolta dati tipo
Stringa):
Public Sub Form_Open()
Dim fl As File
Dim s As String
fl = Open "/percorso/del/file"
' Lettura a lunghezza "fissa":
Read #fl, s, Stat("/percorso/del/file").Size
fl.Close
End
ha impiegato
31 millisecondi.
Ad ogni modo, puoi agevolmente ottenere valori di tipo
Byte da valori a rappresentazione
Stringa utilizzando il metodo
.FromString() della Classe
Byte[]:
Public Sub Form_Open()
Dim fl As File
Dim s As String
Dim bb As Byte[]
fl = Open "/percorso/del/file"
Read #fl, s, Stat("/percorso/del/file").Size
bb = Byte[].FromString(s)
fl.Close
End
Avrei bisogno di ... leggere dei byte a determinate posizioni, modificarli
Se utilizzi l'apertura del file con l'istruzione "
Open..." puoi spostarti all'interno del flusso dei dati mediante la funzione
Seek #variabile_file, indice_dei_dati .
Esempio:
Public Sub Main()
Dim b As Byte
Dim fl As File
fl = Open "/percorso/del/file" For Read
' Spostiamo il puntatore del flusso al byte num. 9 (ossia il 10°):
Seek #fl, 9
' Leggiamo il 10° byte :
Read #fl, b
fl.Close
Print b
End