Api CreateFile() et ReadFile()

Résolu
shadow1779
Messages postés
706
Date d'inscription
mercredi 17 novembre 2004
Statut
Membre
Dernière intervention
29 septembre 2013
- 22 nov. 2005 à 20:19
shadow1779
Messages postés
706
Date d'inscription
mercredi 17 novembre 2004
Statut
Membre
Dernière intervention
29 septembre 2013
- 22 nov. 2005 à 22:04
Bonsoir,



j'ai presque terminé mon logiciel afin de decouper un fichier en
parts... cependant j'ai une erreur et j'arrive vraiment pas a
comprendre, en gros il me decoupe bien ce qui faut mais quand il arrive
en fin de fichier il m'en refet un avec le buffer de la fin et il
recommence sans fin, bref des milliards de fichiers si je le laisse
faire :s



si qqn pouvait me dire ou est l'erreur (ps: y a pas d'erreur a la compilation et c'est en C)



http://shadow1779.ifrance.com/cut.h
.

5 réponses

BruNews
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
22 nov. 2005 à 20:45
Reprends exemple que je t'ai fait, il y a tout ce qu'il faut pour controle de fin de fichier.
"pointeur" n'est pas un nom judicieux, n'oublie pas que c'est ce qui reçoit le nbr octets lus. Prends aussi un autre DWORD pour nbr octets écrits sinon tu perds ta valeur et aucun controle si erreur écriture.
Allez c'est en bonne voie, encore un essai et si merdouille je te le finirai.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
3
BruNews
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
22 nov. 2005 à 21:53
#define MEMDISPO (MEM_RESERVE | MEM_COMMIT)


char fname[264];
// on dit que tu as déjà récupéré fname


HANDLE hsrc, hdst;
DWORD size, d, s, lenbloc, npart;
BYTE *pmem;
char *pnm;
hsrc = CreateFile(fname, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN, 0);
if(hfl == INVALID_HANDLE_VALUE) {
// FAIRE ANNONCE ERREUR FICHIER INDISPONIBLE
return;
}
// FAIRE RECUP ICI de lenbloc
// QUI SERA TAILLE VOULUE POUR FICHIERS DECOUPES


// fname SERA MODIFIE MAIS RESTITUE EN SORTIE
pnm = fname + strlen(fname); // ON PLACE pnm SUR FIN DE fname


pmem = (BYTE*) VirtualAlloc(0, lenbloc, MEMDISPO, PAGE_READWRITE);
if(!pmem) {
// FAIRE ANNONCE ERREUR MEMOIRE
goto closeSRC;
}


*pnm++ = '.'; // pnm DISPO POUR nros DES MORCEAUX
npart = 0; // TU COMMENCES A 1 SI TU VEUX


fromSRC:
s = 0; ReadFile(hsrc, pmem, lenbloc, &s, 0);
if(!s) goto outSRC; // PLUS D'OCTETS = FIN DE FICHIER
ultoa(npart++, pnm, 10); // NOM DE MORCEAU DANS fname
hdst = CreateFile(fname, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
if(hdst == INVALID_HANDLE_VALUE) {
// FAIRE ANNONCE ERREUR CREATION FICHIER
goto outSRC;
}
// ON ECRIT LES s OCTETS LUS ET NON PAS lenbloc
d = 0; WriteFile(hdst, pmem, s, &d, 0);
CloseHandle(hdst);
if(d != s) {
// FAIRE ANNONCE ERREUR ECRITURE
goto outSRC;
}
// SI ENCORE POSSIBLES OCTETS ALORS ON RECOMMENCE
if(s >= lenbloc) goto fromSRC;


outSRC:
*(pnm - 1) = 0; // fname RESTITUE COMME ON L'ATROUVE
relMEM: VirtualFree(pmem, 0, MEM_RELEASE);
closeSRC: CloseHandle(hsrc);

// C'EST FINI
possibles erreurs de frappe, tu le dis si compilo fait la tronche.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
3
shadow1779
Messages postés
706
Date d'inscription
mercredi 17 novembre 2004
Statut
Membre
Dernière intervention
29 septembre 2013

22 nov. 2005 à 20:47
ok j'veu finir seul lol :D en tout cas merci de ton aide ^^, pis la
c'est la version console mais apres faut que j'le fasse en mode
fenestré :D

.
0
BruNews
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
22 nov. 2005 à 20:48
ah ben oui j'y compte bien, on n'est plus au moyen age.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0

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

Posez votre question
shadow1779
Messages postés
706
Date d'inscription
mercredi 17 novembre 2004
Statut
Membre
Dernière intervention
29 septembre 2013

22 nov. 2005 à 22:04
ouai merci beaucoup :D
0