Prob Création de plusieurs fichiers

Signaler
Messages postés
1154
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
-
Messages postés
539
Date d'inscription
vendredi 6 juin 2003
Statut
Membre
Dernière intervention
14 juillet 2010
-
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

Messages postés
539
Date d'inscription
vendredi 6 juin 2003
Statut
Membre
Dernière intervention
14 juillet 2010
1
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 :)
Messages postés
1154
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
14
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 :-(
Messages postés
933
Date d'inscription
dimanche 1 avril 2001
Statut
Modérateur
Dernière intervention
9 janvier 2012
2
aulieu de C:/WINDOWS/Temp/public_key.crypt
C:\\WINDOWS\\Temp\\public_key.crypt
n'aiderai pas ?

@+
Arnotic,
Admin CS, MVP Visual C++
Messages postés
1154
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
14
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
Messages postés
95
Date d'inscription
samedi 19 juin 2004
Statut
Membre
Dernière intervention
20 avril 2010

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.
Messages postés
1154
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
14
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
Messages postés
95
Date d'inscription
samedi 19 juin 2004
Statut
Membre
Dernière intervention
20 avril 2010

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.
Messages postés
1154
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
14
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...
Messages postés
1154
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
14
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)???
Messages postés
1154
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
14
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... [;-)]
Messages postés
1154
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
14
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
Messages postés
95
Date d'inscription
samedi 19 juin 2004
Statut
Membre
Dernière intervention
20 avril 2010

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.
Messages postés
539
Date d'inscription
vendredi 6 juin 2003
Statut
Membre
Dernière intervention
14 juillet 2010
1
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 :)
Messages postés
95
Date d'inscription
samedi 19 juin 2004
Statut
Membre
Dernière intervention
20 avril 2010

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.
Messages postés
539
Date d'inscription
vendredi 6 juin 2003
Statut
Membre
Dernière intervention
14 juillet 2010
1
ah bon!!
youpi :)
Messages postés
1154
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
15 août 2009
14
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
Messages postés
95
Date d'inscription
samedi 19 juin 2004
Statut
Membre
Dernière intervention
20 avril 2010

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.
Messages postés
539
Date d'inscription
vendredi 6 juin 2003
Statut
Membre
Dernière intervention
14 juillet 2010
1
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 :)