ReadFile

Résolu
melkiorlenecrarque Messages postés 97 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 20 janvier 2008 - 11 nov. 2005 à 13:29
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 11 nov. 2005 à 14:22
Bonjour,



J'arrive à lire des fichiers textes avec ReadFile(...), ou meme des .cpp



mais les fichiers avec des caracteres bizzares (mp3, exe, ... ) ne sont pas lus correctement,



c'est pour les transmettre par reseau( la aussi ça marche pour les txt).



Il n'y a pas une histoire d'ouverture en mode binaire ? Comment faire ?



Merci,



Melkior le necrarque

6 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 nov. 2005 à 14:05
Je fais le cas de lecture complète du fichier:

HANDLE hFile;
char dataFile[TaillePak];
DWORD len;


ListeDl[i].currentNbPak = 0;
hFile = CreateFile(ListeDl[i].chemin, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL , NULL);


if(hFile == INVALID_HANDLE_VALUE) return;


fromFL:
len = 0; // COMBIEN REELLEMENT LU
ReadFile(hFile, dataFile, TaillePak, &len, NULL);
if(!len) goto outFL; // FIN DE FICHIER
send(sockfichierE, dataFile, len, NULL); // len OCTETS A ENVOYER
ListeDl[i].currentNbPak++;
if(len >= TaillePak) goto fromFL; // POSSIBLE ENCORE OCTETS A LIRE
outFL:
CloseHandle(hFile);

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 nov. 2005 à 14:22
Gaffe aussi au FILE_SHARE_WRITE, si un autre thread écrit en même temps, tu pourrais avoir des surprises.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
3
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
11 nov. 2005 à 13:46
Oui c'est ça il faut ouvrir en mode binaire.

Tu peux le faire si tu veux avec :



#define TAILLEBUFFER = 1024

char Chaine;

int Taille;



FILE * Fichier = fopen(NomDuFichier, "rb");



while(Taille = fread(&Chaine, 1, TAILLEBUFFER, Fichier))

{

...

}

fclose(Fichier);



YOYO, @+.
YOYO
0
melkiorlenecrarque Messages postés 97 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 20 janvier 2008
11 nov. 2005 à 13:48
Oui j'avais vu cet exemple la sur le forum ou dans les sources, mais je ne peux pas garder les fonctions de l'API win32 ?


merci Yoyo,


Melkior le necrarque.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 nov. 2005 à 13:48
API ne connait QUE le mode binaire donc le prob ne vient pas de là, il n'y a que les libs d'interprétation qui ont des modes.
C'est ta manière de lire le buffer que ReadFile a rempli qui doit merder, faudrait que tu montres.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
melkiorlenecrarque Messages postés 97 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 20 janvier 2008
11 nov. 2005 à 13:52
ok:

HANDLE hFile = CreateFile(ListeDl[i].chemin, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL , NULL);

char dataFile[TaillePak];
DWORD verif;


ListeDl[i].currentNbPak = 0;
DWORD currPos = 0;


for(;;)
{
ZeroMemory(dataFile, TaillePak);
SetFilePointer(hFile, currPos, 0, FILE_BEGIN);
//currPos = SetFilePointer(hFile, 0, 0, FILE_CURRENT);
currPos = currPos + TaillePak;
BOOL err = ReadFile(hFile, dataFile, TaillePak, &verif, NULL);
send(sockfichierE, dataFile, TaillePak, NULL);
ListeDl[i].currentNbPak++;
if( ListeDl[i].len < currPos )
break;
}


CloseHandle(hFile);
0
Rejoignez-nous