PHP fournit seulement quelques fonctions pour traiter la gestion des dossiers. Nous devrons pallier les manques en écrivant nos propres fonctions, avec souvent le recours à la récursivité.

Pour les exemples, nous utiliserons l'aborescence de dossiers ci-contre.

Cet aborescence se trouve dans le dossier test du tutoriel. Vous pouvez voir son contenu avec le bouton dans la barre de menu du tutoriel.

Si vous ne voyez pas cet aborescence, ou si vous voulez la ré-initialiser utilisez ce script.

### Créer un dossier

La création d'un dossier se fait avec la fonction mkdir().

- La fonction renvoie TRUE si la création a réussi, FALSE sinon.
- mkdir() accepte comme premier paramètre le nom du dossier à créer. Ce nom peut contenir un chemin d'accès (relatif ou absolu), et dans ce cas, tous les dossiers sauf le dernier doivent exister.
- mkdir() accepte un deuxième paramètre facultatif qui représente les droits d'accès au dossier (en notation octal comme sous Unix ou Linux).

Le script suivant présente la fonction creerArbo qui permet de créer un dossier et tous les dossiers parents de l'arborescence si ils n'existent pas.

    /**
     * Création d'une arborescence de dossiers
     * @param string    $arbo   Arborescence de dossiers
     * @param integer   $mode   Droit d'accès dossiers en octal
     * @return integer  1: ok, 2: déjà existant, 0: erreur
     */
    function creerArbo($arbo, $mode = 0770) {
        if (@is_dir($arbo)) {
            return 2;
    	}

    	$partie = '.';
    	foreach (explode('/', $arbo) as $dossier) {
    		$partie .= "/$dossier";
    		if (@is_dir($partie)) {
    			continue;
    		}
    		@mkdir($partie, $mode);
    		if (! @is_dir($partie)) {
    			return 0;
    		}
    	}

        return 1;
    }

La fonction creerArbo()commence par vérifier avec is_dir() que le dossier à créer n'existe pas. Si c'est le cas la fonction s'arrête en renvoyant 2.

Ensuite on démonte l'arborescence en utilisant le caractère / comme séparateur et une boucle foreach joint les différentes parties en créant le dossier si il n'existe pas déjà.

Si cette fonction peut être utilisée pour créer une arborescence de dossiers, elle fonctionne aussi très bien pour créer une arborescence ... d'un seul dossier.

Exemple : création d'une arborescence de dossier
<?php ob_start(); require('bib_fonctions.php'); htmlDebut('Création d\'une arboresence'); $arbo = 'test_repert/import/nouveau/textes'; htmlInfo("Création de $arbo"); $ok = creerArbo($arbo); if ($ok == 1) { echo 'Création résussie'; } elseif ($ok == 2) { echo 'Dossier déjà existant'; } else { echo 'Erreur'; } htmlFin(); //===================================================== /** * Création d'une arborescence de dossiers * @param string $arbo Arborescence de dossiers * @param integer $mode Droit d'accès dossiers en octal * @return integer 1: ok, 2: déjà existant, 0: erreur */ function creerArbo($arbo, $mode = 0770) { if (@is_dir($arbo)) { return 2; } $partie = '.'; foreach (explode('/', $arbo) as $dossier) { $partie .= "/$dossier"; if (@is_dir($partie)) { continue; } @mkdir($partie, $mode); if (! @is_dir($partie)) { return 0; } } return 1; } ?>
Vérifier le contenu du dossier de travail

### Supprimer un dossier

La fonction rmdir() supprime un dossier vide.

- rmdir() accepte comme paramètre le nom du dossier à supprimer. Ce nom peut contenir un chemin d'accès, relatif ou absolu.
- rmdir() renvoie TRUE si la suppression a réussi, FALSE sinon.
- Si le dossier n'est pas vide la suppression ne peut pas être faite.

Le script suivant présente la fonction supprimerDossier qui supprime un dossier et son contenu éventuel. La fonction est récursive car le dossier peut contenir des dossiers qui peuvent contenir des dossiers qui peuvent etc.

    /**
     * Suppression d'un dossier et de son contenu
     * @param string    $nom	Nom du dossier
     * @return boolean  TRUE si suppression effectuée
     */
    function supprimerDossier($nom) {
    	if (!@is_dir($nom)) {
    		return false;
    	}
      	//--- lecture du dossier
      	$dossier = @opendir($nom);
    	while (($elem = readdir($dossier)) !== FALSE) {
    		if ($elem == '.' || $elem == '..') {
    			continue;
    		}

    		$complet = "$nom/$elem";
    		if(@is_dir($complet)) {
    			$ok = supprimerDossier($complet);
    		} else {
    			$ok = @unlink($complet);
      		}

    		if (!$ok) {
    			return FALSE;
    		}
    	}
    	@closeDir($dossier);

    	return @rmdir($nom);
    }

La fonction commence par tester si le dossier existe bien. Si ce n'est pas le cas, elle arrête le traitement et renvoie false.
Le dossier est ensuite lu comme vu précédemment. Pour chaque élément trouvé :

- si c'est un dossier, la fonction supprimerDossier() est appelée (récursivité) pour supprimer le dossier et son contenu,
- si c'est un fichier, il est supprimé avec la fonction unlink()

Quand tous les éléments du dossier ont été traité, la fonction renvoie le résultat de rmdir() appliqué sur le dossier courant.

Exemple : suppression d'un dossier et de son contenu
<?php ob_start(); require('bib_fonctions.php'); htmlDebut('Suppresion d\'un dossier'); $dossier = 'test_repert/export'; htmlInfo("Suppression de $dossier"); $ok = supprimerDossier($dossier); if ($ok) { echo 'Suppression résussie'; } else { echo 'Erreur pendant la suppression'; } htmlFin(); //===================================================== /** * Suppression d'un dossier et de son contenu * @param string $nom Nom du dossier * @return boolean TRUE si suppression effectuée */ function supprimerDossier($nom) { if (!@is_dir($nom)) { return false; } //--- lecture du dossier $dossier = @opendir($nom); while (($elem = readdir($dossier)) !== FALSE) { if ($elem == '.' || $elem == '..') { continue; } $complet = "$nom/$elem"; //--- si dossier appel récursif //--- si fichier suppression if(@is_dir($complet)) { $ok = supprimerDossier($complet); } else { $ok = @unlink($complet); } if (!$ok) { return FALSE; } } @closeDir($dossier); return @rmdir($nom); } ?>
Vérifier le contenu du dossier de travail

### Copier un dossier

PHP n'offre pas de fonction permettant de copier un dossier et if faut donc en écrire une. La fonction copierDossier() sera récursive. La fonction accepte comme paramètres le dossier source et le dossier destination (qui ne doit pas exister). Le traitement est simple :

- création du dossier de destination
- boucle de lecture du dossier source
- si l'élément lu est un fichier : copie du fichier
- si l'élément lu est un dossier : appel de la fonction de copie (récursivité)

    /**
     * Copie d'un dossier et de son contenu
     * @param string    $source	Nom du dossier source
     * @param string	$cible	Nom du dossier destination
     * @return integer  1: ok, 0: pas de dossier source,
     *					-1: erreur création destination
     *					-2 : erreur de copie de fichier
     */
    function copierDossier($source, $cible) {
    	if (!@is_dir($source)) {
    		return 0;	// Pas de dossier source
    	}

    	if (creerArbo($cible) != 1) {
    		return -1;	// Erreur création dossier cible
    	}

    	// Lecture du dossier source
    	$dossier = @opendir($source);
    	while (($elem = readdir($dossier)) !== FALSE) {
    		if ($elem == '.' || $elem == '..') {
    			continue;
    		}
    		$sourceComplet = "$source/$elem";
    		$cibleComplet = "$cible/$elem";

    		if (@is_dir($sourceComplet)) {
    			// Traitement récursif - sous-dossier
    			$ok = copierDossier($sourceComplet, $cibleComplet);
    		} else {
    			// Copie d'un fichier
    			$ok = @copy($sourceComplet, $cibleComplet) ? 1 : -2;
    		}

    		if ($ok != 1) {
    			return $ok;
    		}
    	}

    	@closeDir($dossier);

    	return 1;
    }

Exemple : copie d'un dossier
<?php >?php ob_start(); require('bib_fonctions.php'); htmlDebut('copie d\'un dossier'); $source = 'test_repert/images'; $cible = 'test_repert/sauve'; htmlInfo("copie de $source dans $cible"); $ok = copierDossier($source, $cible); if ($ok) { echo 'Copie réussie'; } elseif ($ok == 0) { echo "Le dossier $source n'est pas accessible"; } elseif ($ok == -1) { echo "Le dossier $cible ne peut pas être créé"; } elseif ($ok == -2) { echo "Erreur dans la copie d'un fichier"; } htmlFin(); //===================================================== /** * Copie d'un dossier et de son contenu * @param string $source Nom du dossier source * @param string $cible Nom du dossier destination * @return integer 1: ok, 0: pas de dossier source, * -1: erreur création destination * -2 : erreur de copie de fichier */ function copierDossier($source, $cible) { if (!@is_dir($source)) { return 0; // Pas de dossier source } if (creerArbo($cible) != 1) { return -1; // Erreur création dossier cible } // Lecture du dossier source $dossier = @opendir($source); while (($elem = readdir($dossier)) !== FALSE) { if ($elem == '.' || $elem == '..') { continue; } $srcComplet = "$source/$elem"; $cblComplet = "$cible/$elem"; if (@is_dir($srcComplet)) { // Traitement récursif - sous-dossier $ok = copierDossier($srcComplet, $cblComplet); } else { // Copie d'un fichier $ok = @copy($srcComplet, $cblComplet) ? 1 : -2; } if ($ok != 1) { return $ok; } } @closeDir($dossier); return 1; } //===================================================== /** * Création d'une arborescence de dossiers * @param string $arbo Arborescence de dossiers * @param integer $mode Droit d'accès dossiers en octal * @return integer 1: ok, 2: déjà existant, 0: erreur */ function creerArbo($arbo, $mode = 0770) { if (@is_dir($arbo)) { return 2; } $partie = '.'; foreach (explode('/', $arbo) as $dossier) { $partie .= "/$dossier"; if (@is_dir($partie)) { continue; } @mkdir($partie, $mode); if (! @is_dir($partie)) { return 0; } } return 1; } ?>
Vérifier le contenu du dossier de travail