Partage
  • Partager sur Facebook
  • Partager sur Twitter

remove(windowsPathFile) retourne permission denied

Sujet résolu
    4 avril 2021 à 20:29:30

    Bonsoir,

        if(remove("E:\\Test\\Dossier b\\Dossier ba\\imgweb.jpg") != 0)
        {
            perror(""); // perror() pour décrire l'erreur.
            exit(1);
        }

    ce code retourne "permission denied"...

    • je suis sous windows
    • je suis propriétaire du fichier
    • les autres fichiers .jpg du même dossier ont été supprimés sans problème avec la même commande
    • les extensions sont visibles
    • je peux supprimer le fichier dans windows

    Quelqu'un a une idée ?

    -
    Edité par touvenant 4 avril 2021 à 20:31:02

    • Partager sur Facebook
    • Partager sur Twitter
      4 avril 2021 à 20:32:26

      Le fichier est ouvert ? (avec la visionneuse windows p ex)

      -
      Edité par edgarjacobs 4 avril 2021 à 20:33:46

      • Partager sur Facebook
      • Partager sur Twitter

      On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

        4 avril 2021 à 22:54:14

        non, le fichier n'est pas ouvert.

        • Partager sur Facebook
        • Partager sur Twitter
          5 avril 2021 à 2:16:12

          Dans le Menu contextuel (Shift+F10), ne vois-tu rien d'anormal dans:
          Propriétés
          Donner accès à
          Si tu redémarres ton ordi et que tu exécutes ce code juste après, obtiens-tu le même résultat?
          Ton fichier n'est pas vide? On ne sait jamais ...

          • Partager sur Facebook
          • Partager sur Twitter

          Le Tout est souvent plus grand que la somme de ses parties.

            5 avril 2021 à 7:43:55

            Les attributs du fichier dans l'onglet "Général" des propriétés sont en "lecture seule".

            Lorsque je décoche cette case, ça fonctionne.

            Du coup, je cherche à modifier l'attribut avant d'effacer le fichier ainsi :

                if(system("icacls \"E:\\Test\" /Grant:r \"administrateurs\":(OI)(Ci)F /t /C /q") != -1)
                {
                    printf("changement d'attribut reussie\n");
                }
                else
                {
                    printf("changement d'attribut echouee\n");
                }
                if(remove("E:\\Test\\Dossier b\\Dossier ba\\imgweb.jpg") != 0)
                {
                    perror(""); // perror() pour decrire l'erreur.
                    exit(1);
                }

            et là, grosse surprise !!!

            le code retourne

            31 fichiers correctement traités ; échec du traitement de 0 fichiers
            changement d'attribut reussie
            Permission denied
            

            la case "lecture seule" reste cochée...

            31, c'est bien le nombre de dossiers et fichiers de mon dossier de test

            Ah, Ah, Ah !!! ce code change les permissions, pas les attributs...

            Pour changer les attributs :

                // Changement des attributs des fichiers
                if(system("attrib -r E:\\Test\\*.* /s") == -1)
                {
                    printf("changement d'attribut echoue\n");
                    perror(""); // perror() pour decrire l'erreur.
                    exit(1);
                }
                else
                {
                    printf("changement d'attribut reussi\n");
                }

            Du coup, je réalise qu'il est important de modifier les permissions avant d'effectuer des renommage et suppression de fichiers et de dossiers.
            Je vais donc rajouter ces deux bouts de code mais une question me vient :

            est-ce que "administrateur" dans la commande icacls suffit pour changer les permissions, quel que soit le compte sur lequel on se trouve, ou bien faut-il récupérer le nom d'utilisateur du dossier (pas celui qui se trouve dans l'arborescence de l'explorateur, mais celui que l'on trouve avec >clic droit > propriétés > sécurité...
            Et dans ce cas, comment faire pour récupérer ce nom ?

            -
            Edité par touvenant 5 avril 2021 à 9:37:56

            • Partager sur Facebook
            • Partager sur Twitter
              5 avril 2021 à 12:57:50

              touvenant a écrit:

              Du coup, je réalise qu'il est important de modifier les permissions avant d'effectuer des renommage et suppression de fichiers et de dossiers.

              Je trouve que c'est une mauvaise idée. Sinon à quoi servirait de définir des attributs ?

              Il me semble que la bonne de démarche, c'est de laisser à l'utilisateur le choix des attributs, par exemple le choix de protéger un fichier contre l'effacement. Le programme, lui, doit respecter les choix de l'utilisateur, en particulier il doit retourner une erreur s'il cherche à effacer un fichier protégé. (Un programme qui efface des fichiers que l'utilisateur a voulu protéger, n'est-ce pas plutôt un virus ?...)

              Bref, c'est à mon avis ta première version qui est correcte.

              -
              Edité par robun 5 avril 2021 à 12:58:35

              • Partager sur Facebook
              • Partager sur Twitter
                5 avril 2021 à 13:53:50

                Solution rapide avec fonctions api windows :

                #include <windows.h>
                
                int main()
                {
                    SetFileAttributes("file.txt", 0);
                    DeleteFile("file.txt");
                    return 0;
                }

                On met tous les attributs à 0 et on supprime le fichier !

                • Partager sur Facebook
                • Partager sur Twitter
                  5 avril 2021 à 14:52:45

                  Je suis d'accord avec robun qu'il faut laisser au propriétaire le choix de protéger son fichier.
                  Petite suggestion, placer le nom du fichier dans une chaîne.
                  Ce sera moins risqué de se tromper si on fait plusieurs réféarences à ce nom.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Le Tout est souvent plus grand que la somme de ses parties.

                    5 avril 2021 à 19:19:25

                    Merci pour vos réponse.

                    robun, PierrotLeFou, votre réflexion est empreinte de sagesse, cependant, lorsqu'on souhaite confier à un programme la compression en zip des images d'un répertoire et de ses sous-répertoires et uniquement les images ; que ce programme doit renommer les images .bmp, .png, .jpeg, .tiff en .jpg ; qu'il doit supprimer ensuite ces images, ainsi que les répertoires vides, il doit pouvoir modifier les attributs des images et il est préférable qu'il ait les droits sur les fichiers non ?

                    Ma question demeure :

                    est-ce que "administrateurs" dans la commande icacls suffit pour changer les permissions, quel que soit le compte sur lequel on se trouve, ou bien faut-il récupérer le nom d'utilisateur du dossier (pas celui qui se trouve dans l'arborescence de l'explorateur, mais celui que l'on trouve avec >clic droit > propriétés > sécurité...
                    Et dans ce cas, comment faire pour récupérer ce nom ?

                    • Partager sur Facebook
                    • Partager sur Twitter
                      6 avril 2021 à 2:32:54

                      En C++ il y a la fonction setFileAttributes, mais je ne sais pas si elle fonctionnerait en C
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Le Tout est souvent plus grand que la somme de ses parties.

                        6 avril 2021 à 6:28:05

                        Bonjour, je réalise que ma question concerne la commande icacls qui est une commande microsoft...

                        Ma question n'a rien à faire ici, désolé.

                        Je marque le sujet résolu et je vais poser la question sur le bon forum.

                        Merci de votre aide.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          6 avril 2021 à 10:19:30

                          PierrotLeFou a écrit:

                          En C++ il y a la fonction setFileAttributes, mais je ne sais pas si elle fonctionnerait en C

                          Ce n'est pas une fonction C++ mais une fonction de API Windows. J'ai posté un exemple plus haut :

                          rouloude a écrit:

                          #include <windows.h>
                          
                          int main()
                          {
                              SetFileAttributes("file.txt", 0);
                              DeleteFile("file.txt");
                              return 0;
                          }

                          On met tous les attributs à 0 et on supprime le fichier !





                          • Partager sur Facebook
                          • Partager sur Twitter

                          remove(windowsPathFile) retourne 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