FAQ Qt FAQ Qt Creator FAQ PyQt & PySide

FAQ QtConsultez toutes les FAQ

Nombre d'auteurs : 25, nombre de questions : 299, dernière mise à jour : 15 octobre 2016 

 
OuvrirSommaireModulesQtCoreFichiers et répertoires

Pour supprimer un répertoire, il existe la méthode QDir::rmdir(). Seulement, celle-ci ne fonctionne que si le répertoire est vide. Pour supprimer un répertoire et son contenu (pouvant comprendre différents niveaux de sous-dossiers), on peut utiliser une méthode récursive :

 
Sélectionnez
bool removeDir(const QString& dirPath) //dirPath = le chemin du répertoire à supprimer, ex : "/home/user/monRepertoire")
{
    QDir folder(dirPath);
    //On va lister dans ce répertoire tous les éléments différents de "." et ".."
    //(désignant respectivement le répertoire en cours et le répertoire parent)
    folder.setFilter(QDir::NoDotAndDotDot | QDir::AllEntries);
    foreach(QFileInfo fileInfo, folder.entryInfoList())
    {
        //Si l'élément est un répertoire, on applique la méthode courante à ce répertoire, c'est un appel récursif
        if(fileInfo.isDir())
        {
            if(!removeDir(fileInfo.filePath())) //Si une erreur survient, on retourne false
                return false;
        }
        //Si l'élément est un fichier, on le supprime
        else if(fileInfo.isFile())
        {
            if(!QFile::remove(fileInfo.filePath()))
            {
                //Si une erreur survient, on retourne false
                return false;
            }
        }
    }
 
    //Le dossier est maintenant vide, on le supprime
    if(!folder.rmdir(dirPath))
    {
        //Si une erreur survient, on retourne false
        return false;
    }
 
    //Sinon, on retourne true
    return true;
}

Il est à noter que les méthodes de suppressions de fichiers et de dossiers peuvent échouer. Les raisons sont principalement liés aux droits d'écriture ou à des fichiers ouverts dans d'autres programmes.

Voici une autre solution moyennant QDirIterator. Cet itérateur permet de lister tous les sous-dossiers d'un dossier donné. De ce fait, cette méthode ne nécessite pas d'appel récursif.

 
Sélectionnez
void DeleteDir(const QString& PathDir)
{
 //Création de l'itérateur, on précise qu'on veut tous les sous-dossiers
 QDirIterator dirIterator(PathDir, QDirIterator::Subdirectories);
 
  //On récupère les fichiers et dossiers grâce à l'itérateur
  QFileInfoList fileList;
  while(dirIterator.hasNext())
  {
      dirIterator.next();
      fileList << dirIterator.fileInfo();
  }
 
  //On parcours les éléments
  QStringList directories;
  for(int i = fileList.count() - 1; i > 0; i--)
  {
    //Si l'élément est un fichier, on le supprime
    if(fileList.at(i).isFile())
        QFile::remove(fileList.at(i).absoluteFilePath());
    //On stocke le dossier contenant cet élément dans un liste (si ce n'est pas déjà fait)
    if(!directories.contains(fileList.at(i).absolutePath()))
        directories << fileList.at(i).absolutePath();
  }
 
  QDir dir = QDir::root();
 
  //Finalement, on supprime tous les dossiers
  foreach( const QString StrDir, directories)
  {
     dir.rmdir(StrDir);
  }
}
Créé le 7 mai 2012  par Niak74, François Jaffré
  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2006 - 2016 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.