Partage
  • Partager sur Facebook
  • Partager sur Twitter

remove : permission denied

Sujet résolu
    23 mai 2017 à 16:03:46

    Bonjour,

    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 précise je suis sur Windows. 

    Merci d'avance :)

    -
    Edité par dreadjunk 23 mai 2017 à 16:19:44

    • Partager sur Facebook
    • Partager sur Twitter
      23 mai 2017 à 17:45:27

      Peut-être un exécutable en cours d'exécution ? Ou c'est un fichier qui est utilisé par un autre programme en cours d'exécution ?

      Est-ce que tu as essayé de supprimer ce fichier directement depuis Windows (après en avoir fait une copie bien sûr) ?

      • Partager sur Facebook
      • Partager sur Twitter
        24 mai 2017 à 9:18:08

        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 :euh: 

        • Partager sur Facebook
        • Partager sur Twitter
          24 mai 2017 à 9:27:10

          Salut,

          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.

          • Partager sur Facebook
          • Partager sur Twitter

          Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

            24 mai 2017 à 9:52:04

            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");
                }
            }



            -
            Edité par dreadjunk 24 mai 2017 à 10:20:52

            • Partager sur Facebook
            • Partager sur Twitter
              24 mai 2017 à 18:29:34

              dreadjunk a écrit:

              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.

              -
              Edité par Marc Mongenet 29 mai 2017 à 10:23:29

              • Partager sur Facebook
              • Partager sur Twitter
                29 mai 2017 à 10:22:51

                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
                • Partager sur Facebook
                • Partager sur Twitter

                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.
                • Editeur
                • Markdown