Prob Création de plusieurs fichiers

malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 - 24 août 2004 à 17:26
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010 - 27 août 2004 à 12:53
Hello!

J'ai un programme qui crée et remplit un fichier texte ainsi:

hDestFile = CreateFile("C:/WINDOWS/Temp/this-is-a-temporary-file.crypt",GENERIC_WRITE,NULL,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

if(hDestFile == INVALID_HANDLE_VALUE)
{
delete[] szSrc;
CloseHandle(hDestFile);
return FALSE;
}

Après emploi, je fais un closeHandle et tout va bien...
Pour des raisons pratiques, j'ai voulu créer deux autres fichiers:
Public_Key = CreateFile("C:/WINDOWS/Temp/public_key.crypt",GENERIC_WRITE,NULL,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

if(Public_Key == INVALID_HANDLE_VALUE)
{
delete[] szSrc;
CloseHandle(Public_Key);
return FALSE;
}

Secret_Key = CreateFile("C:/WINDOWS/Temp/secret_key.crypt",GENERIC_WRITE,NULL,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

if(Secret_Key == INVALID_HANDLE_VALUE)
{
delete[] szSrc;
CloseHandle(Secret_Key);
return FALSE;
}


Mais ça plante systématiquement!

Est-ce que quelqu'un a déjà eu ce genre de problèmes? Peut-être que j'initialise mal mes fichiers... ou peut-être que la vérité est ailleurs :question)

HELP!

Thanx, Malik7934

18 réponses

youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
24 août 2004 à 17:52
pourkoi tu fais 2 fois createfile sur Secret_Key, 1 suffi

ca a l'air bien, il te di koi le compilo

sinon fais ca a l'ancienne FILE* f1,f2;
avec fopen

youpi :)
0
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
24 août 2004 à 18:12
Salut Youpi,

Ben le compilo il me dit que tout beigne! Mais quand j'exécute mon application, boum, ça bug!

Avec seulement le fichier hDestFile, ça beigne, ensuite si je mets Public_Key et Secret_key, vides (juste créés, c'est tout), ben ça plante! Je me suis demandé s'il y avait un rapport avec un paramètre de CREATEFILE, mais no idea... un problème de concurrence entre processus??? Je sais pô... je sais juste que j'avance pas dans mon boulot à cause de ça :-(
0
cs_Arnotic Messages postés 933 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 9 janvier 2012
24 août 2004 à 18:23
aulieu de C:/WINDOWS/Temp/public_key.crypt
C:\\WINDOWS\\Temp\\public_key.crypt
n'aiderai pas ?

@+
Arnotic,
Admin CS, MVP Visual C++
0
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
24 août 2004 à 18:28
Alors là je sais pas (je suis plus dans mon labo là), pis je vois pas la différence! Je peux juste dire que ça marchait très bien avec des "/" pour 1 fichier... mais comme l'informatique c'est un peu une profession de foi, j'essaierai ce que tu me dis demain matin!

Thanx, Malik7934
0

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

Posez votre question
jpthomasset Messages postés 95 Date d'inscription samedi 19 juin 2004 Statut Membre Dernière intervention 20 avril 2010
24 août 2004 à 18:32
Salut,

A quel endroit ca plante exactement ? Sur le CreateFile ? Il te renvoit un handle invalide ? Si oui, que vaut le résultat de GetLastError() ?

A+,
JP.
0
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
24 août 2004 à 18:42
Non, c'est beaucoup plus subtil que ça:

Dans mon prog, à un endroit je fait des manips sur des chiffres et je dis de stocker les résultats dans hDestFile. Plus loin, d'autres manips que je fais étaient aussi stockées dans hDestFile, mais pour des raisons pratiques, j'ai voulu les stocker dans Public_Key. Donc, j'ai créé le fichier et ai dit à mon prog de stocker mes résultats là. C'est là que ça à commencé à planté. Après avoir passé facilement 2-3h à chercher le bug, je me suis rendu compte que dès que je crée plus qu'un fichier, mon algorithme plante. Pourtant il n'y a aucune variable en commun!

Ensuite, j'ai même essayé d'éliminer tout ce qui devrait être stocké ailleurs que dans hDestFile, tout en créant Public_Key et Secret_Key et en les laissant vies. Résultats: ça plante (mon code). Sans la déclaration de création de ces deux fichiers, ça marche!!!! C'est n'importe quoi non???!!

Maintenant que j'y pense, il y a peut-être un rapport avec la taille des fichiers. Faudra que je regarde ça demain. Mais si en attendant quelqu'un à sous la main un code qui crée deux fichiers et qui y écrit des trucs, ben moi je dis volontiers merci que je puisse faire un double check!

See you,
Malik7934
0
jpthomasset Messages postés 95 Date d'inscription samedi 19 juin 2004 Statut Membre Dernière intervention 20 avril 2010
24 août 2004 à 21:00
Je viens de faire un test, parce que ton truc m'etonne et ca marche sans problème.

Ou est-ce que ton code plante ? Est-ce que tu as essayé de debugger ? C'est difficile de savoir ce qui se passe sans savoir ou se situe le plantage.

Pour info, voila le code que j'ai utilisé :

int main(int argc, char* argv[])
{
DWORD dBytesWritten;
char *writeBuffer = "Test de données !";

HANDLE hDestFile = CreateFile("C:/WINDOWS/Temp/temp.crypt",
GENERIC_WRITE,NULL,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

if(hDestFile == INVALID_HANDLE_VALUE)
{
CloseHandle(hDestFile);
return 1;
}

if(!WriteFile(hDestFile,writeBuffer,strlen(writeBuffer),&dBytesWritten,NULL)) {
printf("Erreur writing to temp\n");
}

HANDLE hDestFile2 = CreateFile("C:/WINDOWS/Temp/temp2.crypt",
GENERIC_WRITE,NULL,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

if(hDestFile2 == INVALID_HANDLE_VALUE)
{
CloseHandle(hDestFile2);
return 1;
}

if(!WriteFile(hDestFile2,writeBuffer,strlen(writeBuffer),&dBytesWritten,NULL)) {
printf("Erreur writing to temp2\n");
}

HANDLE hDestFile3 = CreateFile("C:/WINDOWS/Temp/temp3.crypt",
GENERIC_WRITE,NULL,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

if(hDestFile3 == INVALID_HANDLE_VALUE)
{
CloseHandle(hDestFile3);
return 1;
}

if(!WriteFile(hDestFile3,writeBuffer,strlen(writeBuffer),&dBytesWritten,NULL)) {
printf("Erreur writing to temp3\n");
}

CloseHandle(hDestFile);
CloseHandle(hDestFile2);
CloseHandle(hDestFile3);

return 0;
}



A+,
JP.
0
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
25 août 2004 à 08:22
Thanx pour l'exemple, mais le problème persiste:

Dans mon code j'ai:

...
hDestFile = CreateFile("C:/WINDOWS/Temp/this-is-a-temporary-file.crypt",GENERIC_WRITE,NULL,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

if(hDestFile == INVALID_HANDLE_VALUE)
{
delete[] szSrc;
CloseHandle(hDestFile);
return FALSE;
}
/*
Public_Key = CreateFile("C:/WINDOWS/Temp/public_key.crypt",GENERIC_WRITE,NULL,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(Public_Key == INVALID_HANDLE_VALUE)
{
CloseHandle(Public_Key);
return FALSE;
}

Secret_Key = CreateFile("C:/WINDOWS/Temp/secret_key.crypt",GENERIC_WRITE,NULL,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(Secret_Key == INVALID_HANDLE_VALUE)
{
CloseHandle(Secret_Key);
return FALSE;
}
*/
...
if(!ReadFile(hSrcFile,szData,dwFileSize,&dwO,0))
{
delete[] szSrc;
delete[] szData;
CloseHandle(hSrcFile);
CloseHandle(hDestFile);
/*		CloseHandle(Public_Key);
CloseHandle(Secret_Key);*/
return FALSE;
}
...
bRet = WriteFile(hDestFile,"PWD1:",5, &dwO,0);
...
delete[] szData;
CloseHandle(hSrcFile);
CloseHandle(hDestFile);
/*	CloseHandle(Public_Key);
CloseHandle(Secret_Key);*/

return bRet;
}


et tout beigne, aussi longtemps que je laisse les commentaires /*...*/, mais dès que je les enlève (càd que je mets le code de Public_Key et Secret_Key), le programme bug... y a de la magie non?
Deux type de bug: Soit leprogramme retourne tout de suite bRet=FALSE, soit il tourne un moment avant de planter sur un WriteFile(hDestFile...)

La haine...
0
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
25 août 2004 à 08:26
STOP!!!!

Je me rends compte que j'arrive à faire planter mon programme (en faisant un effort ( :big) ) avec un seul fichier! Donc je vais d'abord voir ça...

Une question de méga-débutant que je suis: comment utilise-t-on le débogueur (VC6)???
0
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
25 août 2004 à 08:41
Je crois que j'ai compris... mon programme fait du cryptage et j'ai essayé de crypter le fichier Public_key (=> lecture), ce qui demande de le mettre en écriture pour sauver les résultats!!! Concurrence!!! Je vérifie, et je repasse... [;-)]
0
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
25 août 2004 à 08:57
GGGGGGGGGOOOOOOOOOOOAAAAAAAAAAALLLLLLLLLLL!!!!!!!!

Alors...

1) On ne peut pas ouvrir lire et écrire dans le même fichier en même temps, logique (enfin... j'ai mis un moment moi!)

2) Si on le tente, on aura une erreur. Pour que celle-ci ne se répercute pas plus loin, et bien dans le
if(hDestFile == INVALID_HANDLE_VALUE)
{
CloseHandle(hDestFile);
CloseHandle(hSrcFile);
return FALSE;
}
il ne faut surtout pas oublier le CloseHandle(hSrcFile) <-- c'est ça qui m'a créé autant de problème! :clown)

Merci à tous pour votre aide!
Malik7934
0
jpthomasset Messages postés 95 Date d'inscription samedi 19 juin 2004 Statut Membre Dernière intervention 20 avril 2010
25 août 2004 à 11:15
Salut,

1) Si on peut, il faut simplement le précise à l'ouverture du fichier :
GENERIC_READ | GENERIC_WRITE

2) Effectivement moi aussi j'avais oublié de fermer tous les handles en cas d'erreur :blush)

A+,
JP.
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
25 août 2004 à 21:11
je suis stupefais ke ton createfile marche avec des '/'
je suis plutot d'accord avec Arnotic normalement c "C:\\WINDOWS\\Temp\\public_key.crypt" et non "C:/WINDOWS/Temp/public_key.crypt"

je suis étonné ke ca marche, enfin bref..

sinon pour ce ke j'avais di avant j'avais pas vu ke c t 2 handle différent..

bref si ca marche c bien tant mieu
youpi :)
0
jpthomasset Messages postés 95 Date d'inscription samedi 19 juin 2004 Statut Membre Dernière intervention 20 avril 2010
25 août 2004 à 21:49
Pour info, on peux utiliser / ou \ indiférement sauf pour les ressources réseaux.
Extrait du SDK :

Use the backslash (\), the forward slash (/), or both to separate components in a path. No other character is acceptable as a path separator. 


A+,
JP.
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
26 août 2004 à 21:42
ah bon!!
youpi :)
0
malik7934 Messages postés 1154 Date d'inscription mardi 9 septembre 2003 Statut Membre Dernière intervention 15 août 2009 17
27 août 2004 à 07:58
Hello JP,

Comment ça "Si on peut"?? Je suis peut-être nul en c, mais ce que je sais c'est que j'ai fait un cours de systèmes d'exploitation et un autre de conception de systèmes d'informations et s'il y a bien une chose que j'ai retenu de ces cours c'est que si tu as un fichier, il peut être lu par plusieurs personnes, écrit par une seule et ne peut pas être lu en même temps qu'écrit, et inversément! On a même codé des exemples (JDBC)... et ça m'étonne que C échappe à cette règle.

A moins que lorsque tu lis et écris dans un même fichier, en fait il y a en backgound un fichier temporaire pour l'écriture qui, dès que la lecture est finie, écrase le fichier de base....

soit...

A+, Malik7934
0
jpthomasset Messages postés 95 Date d'inscription samedi 19 juin 2004 Statut Membre Dernière intervention 20 avril 2010
27 août 2004 à 09:20
Salut Malik7934,

Alors la,il y a plusieurs choses dans ce que tu dit : il y a le mode d'acces au fichier et le partage d'acces.
Pour le mode d'acces, cela determine si on veux ecrire,lire (ou les deux) dans le fichier. Techniquement on ne peut pas faire les deux en meme temps car on est limité par le matériel, par contre on peut tres bien lire et ecrire d'affilé avec le meme handle si on a précisé les deux modes.
Pour ton probleme initial, il s'agit d'ailleurs de ca, tu veux lire et ecrire dans le fichier avec le meme handle, non ?

A noter quand meme que lors d'opérations asynchrones, on est obligé d'attendre la fin d'une operation d'ecriture avant de pouvoir lire... et inversement.

Ensuite, il y a le partage de fichier : la on peux très bien lire et ecrire dans le fichier depuis deux processus différent (si on précise le partage d'acces). Dans ce cas, c'est le système qui determine ce qui va etre sauvegardé.
En général, pour éviter qu'un process n'ecrase ce q'un autre a écrit, on utilise la fonction LockFile, qui permet de verouiller l'acces à une partie du fichier.

Pour finir, c'est vrai que l'on ne peut pas ecrire et lire en meme temps, mais le systeme d'exploitation nous permet de passer outre la limitation physique en passant par des tampons mémoires.

A+,
JP.
0
youpiyoyo Messages postés 539 Date d'inscription vendredi 6 juin 2003 Statut Membre Dernière intervention 14 juillet 2010
27 août 2004 à 12:53
j'en aprend tous les jours :D
mais il me semble ke jpthomasset a raison car o nivo de partage de variable, et de dll ce ki se resemble etroitement c le meme principe, et je pense ke c possible car si tu regarde la doc de fopen etc,... tu trouvera ke tu peux ouvrir un fichier a la fois en ecriture et en lecture
youpi :)
0
Rejoignez-nous