2017-08-15 3 views
0

J'ai une fonction main.c et une sous-fonction qui y est appelée. Dans la sous-fonction, j'ai utilisé CreateFile pour créer un fichier. J'utilise ensuite CloseHandle pour fermer la poignée à ce fichier. Quand j'utilise fopen_s après cela (dans la sous-fonction) il fonctionne avec les deux modes de lecture et d'écriture. Mais si j'utilise fopen_s dans la fonction principale par la suite, je peux seulement ouvrir avec un accès en lecture, sinon je reçois le code d'erreur 13 - permission refusée. Les paramètres de ma fonction CreateFile sont les suivantes:C - fopen_s ne peut pas écrire dans un fichier créé par CreateFile

hAppend = CreateFile(centralDataFilepath, // open central data file 
       FILE_APPEND_DATA,   // open for writing 
       FILE_SHARE_READ|FILE_SHARE_WRITE,  // allow multiple readers 
       NULL,      // no security 
       OPEN_ALWAYS,    // open or create 
       FILE_ATTRIBUTE_NORMAL, // normal file 
       NULL);     // no attr. template 

Et j'utilise fopen_s comme suit:

FILE *f2; 
errno_t errorCode3 = 0; 
errorCode3 = fopen_s(&f2, centralDataFilepath, "a+"); 
fclose(f2); 

Je ne sais pas vraiment si CreateFile n'a rien à voir avec cela, il semble que le l'autorisation du fichier change après que je quitte la sous-fonction? Je dois être capable d'écrire dans ce fichier, est-ce que quelqu'un savoir pourquoi je reçois cette erreur d'autorisation refusée, et comment y remédier?

+1

Si vous avez utilisé 'CreateFile', pourquoi n'utilisez-vous pas la fonction' WriteFile'? –

+1

Veuillez ne pas décrire votre code. Montrez ce code qui fonctionne et affichez le code qui ne fonctionne pas. Veuillez lire ceci: [mcve] et ceci: [demander]. –

Répondre

2

Comme décrit here:

fichiers qui sont ouverts par fopen_s et _wfopen_s ne sont pas partageables.

La fonction a échoué car elle ne peut pas verrouiller le fichier en écriture. Vous devez utiliser _fsopen à la place. Essayez ceci:

f2 = _fsopen(centralDataFilepath, "a+", _SH_DENYNO); 
+0

_fsopen fonctionne quand j'utilise le tag "r" mais pas pour la mise à jour avec "r +" ... semble toujours être une sorte de problème de partage. Des idées? – Chaz

+0

@Chaz: J'ai testé ce problème. Appelez tout d'abord 'CreateFile' puis appelez' _fsopen' "r +" sur le même fichier et cela fonctionne très bien. S'il vous plaît partagez votre code, cela ne fonctionne pas. –