Newsgroup: it.comp.lang.visual-basic
Titolo: [ Open FILE for binary ] ??? come si utilizza???

Scusate se la domanda e' banale...
Vorrei aprire un file binario e scomporlo in file piu' piccoli... sulla
guida ho trovato poco sull'argomento...
Ho avuto problemi anche solo a copiare un file...
ho fatto un po' di tentativi (quello che segue e' uno di questi...) ma non
sono riuscito a ottenere niente...
Open file1 For Binary As #1
Open file2 For Binary As #2
Do until eof(1)
    n = n + 1
    Get #1, n, valore
    Put #2, n, valore
Loop
Close #1
Close #2
Tempo fa su questo newsgroup avevo letto un messaggio che parlava di questo
ma ora non sono riuscito a ritrovarlo....
Grazie a tutti...
Marco

 
Nei file aperti in modalità Binary, il secondo parametro dell'istruzione
Get indica il numero di byte da cui far partire la lettura della
variabile fornita al terzo argomento. Nel tuo ciclo, la variabile non è
dichiarata, quindi si tratta di una variant. Tu vuoi invece leggere i
singoli Byte... ergo:
Dim valore As Byte
Do until eof(1)
    Get #1, , valore
    Put #2, , valore
Loop
Non ho testato, ma dovrebbe bastare, per la copia.
Per altre operazioni, tieni presente che Get e Put danno molta
importanza al tipo di variabile fornito in argomento. In particolare, il
formato Binary ti permette di memorizzare stringhe a lunghezza
variabile, array a lunghezza variabile, tipi definiti dall'utente
contenenti a loro volta variabili dei tipi suddetti. Questo perché
quando l'istruzione Put ha in argomento un array, scrive nel file un
descrittore che verrà utilizzato in sede di lettura dall'istruzione Get.
Quindi ci sono buoni motivi per dichiarare la variabile As Byte se vuoi
leggere un singolo byte per volta... ;-)
Vorrei approfondire meglio, ma è cosa lunga. C'ho da fare con
l'influenza, ahimé.
Ciao
Flavio Ronco
-- 
f.ronco@*NonMiServeNiente*
flashnet.it
http://www.metabrains.com
  [Under Construction]
-------------------------------------------------------------
"Che pubblico in gamba! Se ci dite dove lavorate,
domani mattina se abbiamo tempo vi veniamo a vedere"
[Paolo Rossi]


1) ma valore di che tipo è? Non dirmi che è un variant, nel tuo esempio al
massimo può essere un Byte.
In questo caso il tuo codice funziona perfettamente ma non è molto
efficiente in quanto ad ogni Get e Put faresti un accesso al disco  e questo
ti rallenterebbe enormemente se il file è grosso.
Puoi risolvere il problema con degli array
il tuo codice diventerebbe
Const BUFF_SIZE = 1024
Dim valore(1 To BUFF_SIZE) As Byte ' 1 accesso al disco = BUFF_SIZE bytes
letti
Dim ByteCount As Long
Dim ByteOver As Integer
Dim i As Integer
Open file1 For Binary As #1
Open file1 For Binary As #2
Do Until EOF(1)
    Get #1, , valore()     'leggo BUFF_SIZE bytes
    BytesCount = BytesCount + BUFF_SIZE     'aggiorno il contatore
    BytesOver = BytesCount - FileLen(file1)     'controllo di non aver letto
oltre la fine del file
    If (BytesOver > 0) Then ' se ho letto oltre l'EOF scrivo solo i bytes
validi
        For i = 1 To (BUFF_SIZE - (BytesOver))
            Put #2, , valore(i)
        Next i
    Else
        Put #2, , valore() 'scrivo tutto il buffer
    End If
Loop
Close #1
Close #2
Ricordiamoci che per copiare i file è senz'altro meglio la FileCopy()
Ciao