Fonction capricieuse

Utilisateur anonyme -  
 Utilisateur anonyme -
Bonjour les amis,

je viens de pondre une fonction pour supprimer le contenue d'un dossier passé en paramètre.
mais elle refuse de fonctionner, je comprend pas pourquoi ... mes vérification ne retourne pas d'erreur et tout compile a merveille, pourtant rien ne change dans mon dossier a supprimé .

voila ma fonction, si vous avez des idée d'optimisation je suis preneur.
void Para::DeleteFolder(std::string path)
{
  struct dirent* file = NULL;
  DIR* rep = NULL;

  rep = opendir(path.c_str());
  while ((file = readdir(rep)) != NULL && rep)
    {
      if (strcmp(file->d_name, "..") != 0 && strcmp(file->d_name, ".") != 0)
        {
          if (isDir(file->d_name) == false && rmdir(file->d_name) == -1)
            DeleteFolder(PathBuild(path, file->d_name));
          else if (remove(file->d_name) == -1)
            error(14);
        }
    }
  if (!rep)
    error(3);
  if (closedir(rep) == -1)
    error(4);
}


ma fonction 'pathbuild' ce contente de rajouté le nom du dossier trouvé a la fin du chemin passer en paramétre. et elle est correcte elle.

1 réponse

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    Bonjour,

    Je suis un peu rouillé en C++ mais je ne comprends pas ceci :

    if (isDir(file->d_name) == false && rmdir(file->d_name) == -1)
        DeleteFolder(PathBuild(path, file->d_name));

    Pourquoi faire un
    rmdir
    et un
    DeleteFolder
    si
    isDir
    renvoie false ?

    De plus je pense qu'il faudrait que tu fasses le
    rmdir
    après avoir supprimé tout les
    opendir
    en cours, c'est à dire après la boucle, pas pendant.

    Je n'ai pas testé :

    void Para::DeleteFolder(std::string path)
    {
        DIR* rep = opendir(path.c_str());
        if (!rep)
            error(3);
    
        struct dirent* file = NULL;
        while ((file = readdir(rep)) != NULL)
        {
            if (strcmp(file->d_name, "..") == 0
                || strcmp(file->d_name, ".") == 0)
                continue;
    
            if (isDir(file->d_name))
                DeleteFolder(PathBuild(path, file->d_name));
            else if (remove(file->d_name) == -1)
                error(14);
        }
    
        if (closedir(rep) == -1)
            error(4);
        if (rmdir(rep) == -1)
            error(?);
    }
    0
    1. Utilisateur anonyme
       
      Autant pour moi KX, il semble en effet que je me soit embrouiller dans ce IF...

      la fonction que tu ma fait me semble pas mal, sauf sur un point.
      mon dossier contient des sous dossier que je veut également voir disparaître.
      si je suis ta logique seul le dossier qui contient l’ensemble va subir une tentative de suppression, qui normalement devrais échouer étant donner que ce dossier "qui contient encore d'autre dossier" n'est pas vide .

      et la est mon problème justement ...

      sauf si tu me dit que le compilo ne considère pas un dossier comme du contenue, et que si tout ses dernier ne stocke plus de fichiers le dossier mère peut être supprimé sans problème. mais j'en doute .
      0
    2. KX Messages postés 19031 Statut Modérateur 3 020
       
      "si je suis ta logique seul le dossier qui contient l’ensemble va subir une tentative de suppression"
      Non, car on appelle récursivement DeleteFolder dans ce if (ce qui était déjà le cas dans ton code), donc on va d'abord supprimer les sous-dossier avant de continuer la suppression du répertoire en cours, que l'on ne supprime qu'à la fin, lorsqu'il est complètement vide (sauf erreur de suppression avant).

      if (isDir(file->d_name)) // si c'est un sous-dossier
          DeleteFolder(PathBuild(path, file->d_name)); // on le supprime
      0
    3. Utilisateur anonyme
       
      Effectivement c'est plutôt pas mal ...
      je teste cela de suite.
      0
    4. Utilisateur anonyme
       
      il semble que rmdir ne permette pas de prendre en paramètre un type DIR*
      0