Quelles sont les lunettes de prescription non http://belgiquepharmacie.be/ Unie de liberté de santé oxford

Voici une petite fonction pour supprimer un répertoire et toute son arborescence. J’utilise ici la Standard PHP Library (SPL) et notamment son itérateur RecursiveDirectoryIterator qui permet de traverser récursivement un répertoire.

Il est important de noter l’utilisation de la constante RecursiveIteratorIterator::CHILD_FIRST. Grâce à elle, l’itérateur, instance de la classe RecursiveIteratorIterator, va parcourir récursivevement les fichiers des dossiers. Après avoir supprimés les fichiers, l’itérateur passe au dossier parent qui pourra être à son tour détruit. En effet, la fonction rmdir ne peut qu’effacer un dossier vide.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?php
/**
 * Attempts to remove recursively the directory named by dirname.
 *
 * @author Mehdi Kabab <http://pioupioum.fr>
 * @copyright Copyright (C) 2009 Mehdi Kabab
 * @license http://www.gnu.org/licenses/gpl.html  GNU GPL version 3 or later
 *
 * @param string $dirname Path to the directory.
 * @param boolean $followLinks Removes symbolic links if set to TRUE.
 * @return boolean Returns TRUE on success or FALSE on failure.
 * @throws Exception
 */
function recursive_rmdir($dirname, $followLinks = false)
{
    if (is_dir($dirname) && !is_link($dirname))
    {
        if (!is_writable($dirname))
            throw new Exception('You do not have renaming permissions!');
 
        $iterator = new RecursiveIteratorIterator(
            new RecursiveDirectoryIterator($dirname),
            RecursiveIteratorIterator::CHILD_FIRST
        );
 
        while ($iterator->valid())
        {
            if (!$iterator->isDot())
            {
                if (!$iterator->isWritable())
                {
                    throw new Exception(sprintf(
                        'Permission Denied: %s.',
                        $iterator->getPathName()
                    ));
                }
                if ($iterator->isLink() && false === (boolean) $followLinks)
                {
                    $iterator->next();
                }
                if ($iterator->isFile())
                {
                    unlink($iterator->getPathName());
                }
                else if ($iterator->isDir())
                {
                    rmdir($iterator->getPathName());
                }
            }
 
            $iterator->next();
        }
        unset($iterator); // Fix for Windows.
 
        return rmdir($dirname);
    }
    else
    {
        throw new Exception(sprintf('Directory %s does not exist!', $dirname));
    }
}
?>

Mis à jour du 02/08/2009
Suppression de la levée d’exception sur la suppression du lien symbolique. Le script passe au fichier suivant. Merci à Oncle Tom.

Mis à jour du 03/08/2009
Patch pour Windows. Libération de l’itérateur qui ferme correctement le répertoire à supprimer. Merci à Yho.

publicité (chargement)

15 réponses pour PHP : supprimer récursivement un répertoire

  1. Palleas dit :

    Aaah, enfin quelqu’un qui utilise la SPL pour ce genre de truc, ça fait plaisir !

    (Par contre j’aime pas les gens qui sautent une ligne avant une accolade :D )

    GG !

  2. Damien dit :

    Roh t’a pris mon thème :(

  3. piouPiouM dit :

    @Palleas ça fait un moment que je me traîne cette fonction (mais pas le blog pour la poster :]). La SPL est vraiment pratique dans ce cas de figure, pourquoi s’en priver ? :)

    @Damien je t’en avais parlé à l’occasion d’un apéro blog : je l’avais choisi avant que tu l’utilises. Mais t’inquiète, le thème va se prendre une claque (il a déjà commencé structurellement parlant).

  4. Fab dit :

    Non mais sérieux PiouM! T’as un blog et j’apprend ça sur twitter! bon ba tu te met à flex après ?!

  5. patpro dit :

    Je voudrai pas faire mon rabat-joie, mais être obligé d’écrire une fonction de 60 lignes pour faire un rm -r, ça me donnerait vraiment envie de changer de langage…

  6. piouPiouM dit :

    PHP peut évidemment faire appel aux commandes système. Cependant cet accès n’est pas toujours autorisé. D’où cette fonction.

  7. patpro dit :

    Je sais bien, mais là n’est pas la question. Les appels directs aux fonctions système c’est sale. Ils auraient pu prévoir directement un équivalent intégré.

  8. yoy dit :

    Hello

    Classe ton blog :) par contre je trouve que le nom de la fonction est pas super appropriée puisque qu’elle n’est pas recursive… mais bon.. c’est vraiment pour poster un commentaire ;)

    a++

    YO

  9. piouPiouM dit :

    @Fab je ne désespère pas de me mettre un jour à Flex ^_^
    @yoy tu n’as pas tord, j’aurai peut-être du la nommer rm_hierarchy :-/

  10. Oncle Tom dit :

    Je repense à ton exception lancée sur la suppression du lien symbolique : faut-il vraiment la mettre ? En faisant ça tu bloque le processus et c’est peut-être pas l’effet recherché.

    J’aurais vu que ça le zappe. Le répertoire ne pourra a priori pas être supprimé tant qu’il contient un élément à l’intérieur.

  11. piouPiouM dit :

    Effectivement, autant l’exception levée sur un problème de permissions est justifié car dépend du système de fichiers, autant celle lancée pour le lien symbolique est conditionnée par le bon usage d’un argument de la fonction. Un test sur la valeur retournée par la fonction est de toute manière souhaitable.

    Bref, je vais retirer cette exception. Merci pour ce retour !

  12. Oncle Tom dit :

    De rien de rien :-) J’aurais découvert cette classe très utile d’itération, merci aussi ;-)

  13. Yho dit :

    Sous Windows, la suppression du dossier peut échouer. Il faut libérer l’itérateur pour que le dossier soit fermé avant sa suppression.

    Il suffit pour cela d’ajouter :

    $iterator= null;

    Avant la ligne :

    return rmdir($dirname);

  14. piouPiouM dit :

    Merci pour la précision. Je corrige cela.

  15. clem dit :

    Merci, l’article m’a bien aidé à comprendre ;)

Ajouter un commentaire


Syndication

Réseaux sociaux