Fonction capricieuse

Fermé
Utilisateur anonyme - 6 août 2016 à 12:11
 Utilisateur anonyme - 6 août 2016 à 18:32
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

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
6 août 2016 à 12:55
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
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
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
Modifié par KX le 6/08/2016 à 17:21
"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
Utilisateur anonyme
6 août 2016 à 17:55
Effectivement c'est plutôt pas mal ...
je teste cela de suite.
0
Utilisateur anonyme
6 août 2016 à 18:32
il semble que rmdir ne permette pas de prendre en paramètre un type DIR*
0