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.
La création d'un dossier se fait avec la fonction mkdir().
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.
Vérifier le contenu du dossier de travailLa fonction rmdir() supprime un dossier vide.
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é :
Quand tous les éléments du dossier ont été traité, la fonction renvoie le résultat de rmdir() appliqué sur le dossier courant.
Vérifier le contenu du dossier de travailPHP 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 :
/**
* 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;
}
Vérifier le contenu du dossier de travail