Newsgroup: it.comp.lang.visual-basic
Titolo: Lettura di un file in VB-6.

Ho scritto un'utility per mie esigenze personali. Devo leggere 
un file e la sua dimensione è circa 4 Gb (è un file video in 
formato MPEG).
  Questo è il pezzo di codice che mi crea problemi....  
Const LenDati           As Long = 2048     
 
Dim nByteA              As Long
Dim xFileA              As Integer
Dim NameFileA           As String
Dim bufferA             As String * LenDati
xFileA = FreeFile
Open NameFileA For Binary Access Read Shared As #xFileA
  Do Until EOF(xFileA)
     Get #xFileA, , bufferA
     ' Elaborazione dei dati presenti in bufferA
     ...
     ...
  Loop
Close #xFileA
  Il secondo parametro della Get è il puntatore all'interno del 
file (se viene omesso si incrementa automaticamente ad ogni 
lettura) ed di fatto è un Long per cui quando supera la capacità 
di 2^31 (poco più di 2 Gb) diventa negativo è la funzione va in 
errore. 
  Questo accade anche con le altre funzioni di acceso ai file 
come ad esempio...  FileLen(nomefile).
  Dopo le prime perplessità ho capito che ciò accade perché i 
puntatori sono definiti nelle varie DLL come Long e quindi non 
dipende dal mio programma.
  Tale fatto impedisce di gestire file più grandi di 2^31 
perlomeno usando gli strumenti standard di Visual Basic.
  Forse esistono funzioni API in DLL di sistema (Windows 
2000/XP) che possano risolvere il problema.
 
  Qualcuno è in grado di fornirmi una soluzione ?
-- 
Postato da Virgilio Newsgroup: scopri i nuovi gruppi 
Eros, foto e video a 
http://newsgroup.eros.virgilio.it

 ha
scritto:

Con le API puoi usare CreateFile, SetFilePointer, ReadFile.
C'è un esempio qui:
http://allapi.mentalis.org/apilist/SetFilePointer.shtml
ma il limite del Long rimane, per file molto grandi l'unica che mi viene in
mente è splittare il file originario in più files e analizzarli separatamente.
--
ciao
  Stefano

   Stefano
  Avevo pensato ad una soluzione di questo tipo ma per splittare 
un file dovrei usare programmi esterni perché sarebbe 
impossibile 'leggere' e riscrivere due o più file sempre a causa 
del tipo Long.
  Molti programmi comuni e lo stesso Windows gestiscono 
correttamente il problema e pertanto penso che la soluzione 
dovrebbe essere a portata di mano (probabilmente in una delle 
mille librerie di sistema) ma nonostante gli sforzi fatti per 
cercare notizie in merito sono rimasto fermo al palo.
  Ti ringrazio comunque per la disponibilità e velocità nella 
risposta.
  ciao Mario.


risposta.
Buone notizie, leggi qui:
http://www.codeproject.com/system/cfile64.asp
Non ho potuto approfondire, ma direi che c'è tutto quello che ti serve.
--
ciao
  Stefano


Forse questo potrà esserti utile:
http://support.microsoft.com/default.aspx?scid=kb;NL;q189981
Bye
Raf
-----------------------------------------------------
Funk: cooler than the other side of the pillow.
--------------------------------------------------------------------------------
La mia Cartella di Posta in Arrivo è protetta con SPAMfighter
936 messaggi contenenti spam sono stati bloccati con successo.
Scarica gratuitamente SPAMfighter!

 del tipo Long.
Non ho tempo di leggerlo, casomai vedi se serve a qualcosa:
http://groups.google.com/group/microsoft.public.vb.general.discussion/browse_thread/thread/b8efb6d588be1eb7/969dddca431a7cdf
Non so se fa riferimento all'api ReadFile
Declare Function ReadFile Lib "kernel32" Alias "ReadFile" (ByVal hFile As
Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long,
lpNumberOfBytesRead As Long, lpOverlapped As OVERLAPPED) As Long
C'č un punto in cui dice:
| When writing your parser, always open the file in binary mode and unless
| you're working with textual data, never use strings for reading data in
| or writing data out to avoid ASCII <-> UNICODE and locale issues.  Your
| other option is to use an API based file parser which is slightly more
| complex but gives you slightly more efficient data handling when working
| with large chunks of data, and is essential when working with large (>2
| GB) files since VB's file handling routines will not cope with this.
Ciao
-- 
DBMS Firebird
VB6 + Ado

 
  Anche io avevo cercato notizie sul web ma probabilmente i miei 
termini di ricerca non davano i risultati che mi aspettavo.
  Come sempre i forum si dimostrano preziosi
  Ti ringrazio ancora dell'aiuto fornitomi.
  ciao Mario.
  Un grazie a tutti coloro che hanno risposto.
