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.



A voir également:

1 réponse

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   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
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
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   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
Utilisateur anonyme
 
Effectivement c'est plutôt pas mal ...
je teste cela de suite.
0
Utilisateur anonyme
 
il semble que rmdir ne permette pas de prendre en paramètre un type DIR*
0