Je fais un programme ou je dois effectuer de la modification de fichier, pour cela je créer un autre fichier temporaire ou je met les modification puis je supprime le fichier principale et renomme le fichier temporaire. Le problème vient du moment ou je fais la suppression du fichier, j'obtient l'erreur suivante: "permission denied".
J'ai essayé plusieurs trucs : regardé si le fichier est bien fermé avec fclose avant suppression -> c'est le cas. Regardé si j'ai les droits pour le faire, c'est bon aussi. J'ai mis le chemin absolue en argument.
Donc je viens vous demander si il y a d'autre raisons possible pour avoir cette erreur?
Je peux supprimer le fichier directement depuis windows, et il n'y a aucun autre programme qui utilise ce fichier vu que c'est le seul programme et que c'est un fichier créer par ce programme (c'est un fichier texte rien de plus).
Je montrerais bien le code, mais c'est assez long comme code pour tout voir, donc pas très utile si je le montre je pense
c'est un fichier que tu as lu, et que tu veux effacer ?
Si tu fais un fclose, immédiatement suivi d'un remove, ça peut en effet foirer : il y a un temps de latence (peut être une seconde ou moins) entre le dernier accès du fichier et sa libération.
Essaie de mettre un Sleep de une seconde avant de faire le remove, pour voir.
Je viens d'essayer de mettre un Sleep de 1s avant la fonction ou il y a le remove mais aucun changement.
Bon je vais mettre mon code ca sera peut etre plus simple. J'ai commenté le code pour montrer ou le code passé. Désolé c'est un peu touffu et un peu mal codé aussi surement ...
//La fonction modifie le fichier en fonction du mode choisie,
//mode = 0 : La fonction permet de rentrer de nouvelle valeurs dans le fichier .txt correspondant au capteur et machine du str.
//mode = 1 : supprime toute donnée plus veille que MAX_DAY_REFRESH sur le .txt
//mode = 2 : supprimer une valeur précise
static void modify_file(char *date, float donnee , int index, int mode, char *name_file, int index_value)
{
//On créer les fichiers sources et cible pour faire la modification
FILE* fichier_source = NULL;
FILE* fichier_cible = NULL;
printf("modify_file donnee : %f \n", donnee);
fichier_source = fopen(name_file, "r");
if(fichier_source != NULL)
{
fichier_cible = fopen(PATH_TMP, "a");
if(fichier_cible != NULL)
{
choose_mode(fichier_source, mode, index, date, donnee, index_value);
fclose(fichier_cible);
fclose(fichier_source);
replace_file(name_file);
}
else
{
printf("impossible d'ouvrir le fichier donnée.tmp");
fclose(fichier_source);
}
}
else
{
printf("impossible d'ouvrir le fichier donnée.txt");
}
}
static void choose_mode(FILE *fichier_source, int mode, int index, char *date, float donnee, int index_value)
{
char str_cmp[MAX_SIZE];
json_object *jobject;
int i = 0;
while(fgets(str_cmp, MAX_SIZE, fichier_source) != NULL)
{
printf("modify_file mode : %i \n", mode);
jobject = json_tokener_parse(str_cmp);
if(if_empty_line(str_cmp) == 0)
{
if(json_object_array_length(json_object_object_get(jobject, "Donnee")) == json_object_array_length(json_object_object_get(jobject, "Temps"))) //Prendre en compte le cas ou la ligne est vide
{
int arraylen = json_object_array_length(json_object_object_get(jobject, "Donnee"));
if(mode == 0)
{
add_in_file(arraylen, index, i, jobject, date, donnee);
}
if(mode == 1)
{
refresh_file(arraylen, jobject);
}
if(mode == 2)
{
remove_value(arraylen, i, index, index_value, jobject);
}
}
else
{
printf("Le json preleve dans le fichier ne possède pas le meme nombre de valeurs dans Donnee et Temps !");
}
}
i++;
}
}
static void remove_value(int arraylen, int i, int index_json, int index_value, json_object *jobject)
{
json_object *jarray_donnee = json_object_new_array();
json_object *jarray_temps = json_object_new_array();
int l;
printf("i : %i , index_json : %i \n", i, index_json);
if(i == index_json)
{
for(l = 0; l < arraylen; l++)
{
if(l != index_value)
{
json_object_array_add(jarray_donnee,json_object_new_string(json_object_get_string(json_object_array_get_idx(json_object_object_get(jobject, "Donnee"), l))));
json_object_array_add(jarray_temps,json_object_new_string(json_object_get_string(json_object_array_get_idx(json_object_object_get(jobject, "Temps"), l))));
}
}
printf(" remove_value str donnee : %s \n", json_object_get_string(jarray_donnee));
//On supprime les arrays Temps et Donnee
json_object_object_del(jobject, "Donnee");
json_object_object_del(jobject, "Temps");
//On ajoute les arrays dans le json
json_object_object_add(jobject,"Donnee",jarray_donnee);
json_object_object_add(jobject,"Temps",jarray_temps);
printf("json jobject : %s \n", json_object_to_json_string(jobject));
write_file_json(PATH_TMP,jobject);
}
}
//Ecrit sur le fichier contenant les données de la machine (les json)
static void write_file(char* nom_fichier, char* str)
{
FILE* fichier = NULL;
printf("%s \n", nom_fichier);
fichier = fopen(nom_fichier,"a");
//test d'ouverture du fichier
if(fichier != NULL)
{
//On place la string dans le fichier
fputs(str,fichier);
fputs("\n",fichier);
fclose(fichier);
}
else
{
perror("fopen");
printf("impossible d'ouvrir le fichier \n");
}
}
static void write_file_json(char* nom_fichier, json_object *jobject)
{
char* str = json_object_to_json_string(jobject);
write_file(nom_fichier, str);
}
//On remplace le fichier .txt par le fichier .tmp
static void replace_file(char *name_file)
{
int status = remove(name_file); //C'est cette fonction remove qui engendre des problèmes !
if(status == 0)
{
printf("Fichier supprimer \n");
}
else
{
perror("remove");
}
int resultat_rename = rename(PATH_TMP,name_file);
if(resultat_rename == 0)
{
printf("Rename a fonctionne \n");
}
else
{
perror("rename");
printf("erreur rename \n");
}
}
Bon je vais mettre mon code ca sera peut etre plus simple.
Merci pour le code.
Es-tu sûr que le fichier n'est pas ouvert deux fois? En effet, on voit bien le fopen et le fclose correspondant dans modify_file, mais il se pourrait que le fichier a été précédemment ouvert et pas encore fermé. Concernant les droits du fichier, as-tu vérifié que tu as bien le droit de le supprimer du répertoire. Je ne connais pas bien Windows, mais sur Unix ça dépend plus de droits du répertoire que du fichier, ça peut amener à confusion.
J'ai trouvé le problème, un autre fichier était ouvert avant sans être fermé, je pensais pas que ca allait créer des problèmes. Merci encore pour l'aide
remove : permission denied
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html