Newsgroup: it.comp.programmare.win32
Titolo: Lettura file a blocchi

Mi serve da leggere un file a blocchi ad esempio di 4kb l'uno quando
magari il file è da 16kb (esempio), come posso fare utilizzando le api
di windows (readfile)? Posto un blocco di codice che sto utilizzando...
BYTE pbFile[4000];
hFile = CreateFile("C:\\prova.gif",GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL);
ReadFile(hFile,pbFile,4000,&dwLetti,NULL);
for(i=0; i<4; i++)
{
  ReadFile(hFile,pbFile,4000,&dwLetti,NULL);
}
Chiaramente il ciclo non ha senso poichè legge sempre i primi 4000byte
del file, inoltre non ha senso sulla lettura perchè se il file è più
piccolo legge il file inutilmente ma è solo un particolare...A me
interessava sapere se c'è qualche parametro della ReadFile che
permette di proseguire la lettura da un determinato numero di byte...

 permette di proseguire la lettura da un determinato numero di byte...
Per spostare il file pointer, si usa SetFilePointer (solo per file piu' 
piccoli di 2 GB) o SetFilePointerEx.
-- 
     Carlo Milanesi
 
http://digilander.libero.it/carlmila

piccoli di 2 GB) o SetFilePointerEx.
Ottimo proverò al più presto questa funzione.
Un'altra cosa che mi attanaglia è il problema degli zeri all'interno
di un file. Quando leggo il file, al primo zero che incontro, il c
termina automaticamente l'array di byte e questo per me è un problema
(dato che successivamente devo inviarlo con la funzione send), ho
parzialmente risolto il problema impostando un 1 e poi un 127
nell'array cosìcchè il programma ricevente se trova queste due cifre
consecutive lo interpreta come se fosse un zero e lo inserisce
nell'array (che ricostruirà) il problema viene se nel file sono
realmente presenti queste due cifre consecutive (ipotesi remota ma
possibile), avete qualke spunto da darmi?

possibile), avete qualke spunto da darmi?
Ho risolto era un problemino assurdo...
Quindi utilizzando la SetFilePointerEx avrebbe senso un codice del
genere?
BYTE pBuf[32000], pInv[32011];
DWORD dwLetti;
long int i=0;
// Ometto l'apertura con CreateFile di un file da 100MB tenendo
presente che è riuscito ad aprirlo
// Leggo i primi 32000 byte
ReadFile(hFile, pBuf, 32000, &dwLetti, NULL);
for(i=0; i<dwLetti; i++)
{
   if(i>0)
     ReadFile(hFile, pBuf, 32000, &dwLetti, NULL);
   // Nelle prime 11 celle pInv contiene dati da me utilizzati per la
comunicazione col socket
   pInv[i+11] = pBuf[i];
   send(sSocket, pInv, dwLetti+11, 0);
   SetFilePointerEx(hFile, 32000, NULL, FILE_CURRENT);
}
Come vi sembra?

Errata corrige:
ReadFile(hFile, pBuf, 32000, &dwLetti, NULL);
for(i=0; i<dwLetti; i++)
{
  pInv[i+11] = pBuf[i];
}
send(sSocket, pInv, dwLetti+11, 0);
SetFilePointerEx(hFile, 32000, NULL, FILE_CURRENT);
Solo che non so come inserirlo in un contesto di un ciclo che termina
quando finisce il file...

 quando finisce il file...
while(ReadFile(....) && dwletti!=0)
{
........
........
}
della setfilepointer non ne hai bisogno!
cosi come lo usi in questo momento il secondo blocco di 32000byte lo 
salti completamente
ciao

salti completamente
Cioè si auto incrementa il file pointer?

 Cioč si auto incrementa il file pointer?
O non hai letto bene il mio messaggio, o non capisci l'inglese, quindi 
te lo traduco in italiano.
"La funzione ReadFile legge i dati da un file, inziando dalla posizione 
indicata dal puntatore al file. Dopo che l'operazione di lettura e' 
stata completata, il puntatore al file viene riposizionato del numero di 
byte effettivamente letti, a meno che lo handle del file sia creato con 
l'attributo overlapped."
D'altra parte, in tutti i linguaggi di programmazione, la funzione per 
leggere da un file o da uno stream, dopo aver letto un dato passa 
automaticamente al dato successivo!


> O non hai letto bene il mio messaggio, o non capisci l'inglese
Hai azzeccato completamente con la seconda :)...Adesso ho capito grazie
1000