La fonction dir () est utilisée pour ouvrir une poignée de répertoire et renvoyer un objet de répertoire . Le fichier et les noms de sous-répertoire dans le répertoire peuvent être lus un par un via la méthode read () de cet objet.
Exemple de syntaxe:
$dir = dir('chemin');
while (($file = $dir->read()) !== false) {
echo $file . PHP_EOL;
}
$dir->close();
Notez que la méthode read () renvoie chaque nom de fichier dans le répertoire actuel, y compris les deux répertoires spéciaux :. et .. , et doit être exclu.
Ce qui suit est un exemple de code pour utiliser la fonction dir () pour obtenir toutes les sous-répertoires dans un répertoire spécifié:
<?php
function getSubDirectories($path) {
$subDirs = [];
if (!is_dir($path)) {
return $subDirs; // chemin不是目录,Retourner un tableau vide
}
$dir = dir($path);
while (($entry = $dir->read()) !== false) {
// exclure . et ..
if ($entry === '.' || $entry === '..') {
continue;
}
$fullPath = $path . DIRECTORY_SEPARATOR . $entry;
if (is_dir($fullPath)) {
$subDirs[] = $entry;
}
}
$dir->close();
return $subDirs;
}
// Tester
$path = '/var/www/html';
$dirs = getSubDirectories($path);
print_r($dirs);
?>
Dans ce code:
Vérifiez d'abord si le chemin d'entrée est un répertoire.
Ouvrez la poignée du répertoire via dir () .
Lisez chaque entrée, excluez . et ...
Utilisez is_dir () pour déterminer s'il s'agit d'un répertoire.
Enregistrez tous les noms de sous-répertoire dans un tableau et retournez.
Si vous devez générer un lien d'accès pour chaque sous-répertoire de la page de sortie, l'exemple de code est le suivant:
<?php
$path = '/var/www/html';
$dir = dir($path);
while (($entry = $dir->read()) !== false) {
if ($entry === '.' || $entry === '..') {
continue;
}
$fullPath = $path . DIRECTORY_SEPARATOR . $entry;
if (is_dir($fullPath)) {
echo '<a href="http://gitbox.net/' . $entry . '">' . $entry . '</a><br>';
}
}
$dir->close();
?>
Ici, nous avons remplacé le nom de domaine d'URL d'origine par gitbox.net pour une démonstration facile.
Filtrez des éléments non réceptaires : filtrez via is_dir () pour s'assurer que seuls les répertoires sont récupérés.
Traversion récursive : Si vous souhaitez obtenir des sous-répertoires de tous les niveaux, vous pouvez appeler la fonction récursivement après avoir jugé qu'il s'agit d'un répertoire.
Stitchage de chemin : utilisez Directory_Separator pour assurer la compatibilité multiplateforme.
Gestion des exceptions : il est préférable de juger si le répertoire existe et est lisible avant de l'ouvrir pour éviter les erreurs.
En utilisant la fonction dir () combinée avec les techniques ci-dessus, vous pouvez facilement implémenter l'acquisition de traversée de répertoire et de sous-répertoire pour répondre aux besoins de la plupart des scénarios.
<?php
function getAllSubDirsRecursive($path) {
$result = [];
if (!is_dir($path)) {
return $result;
}
$dir = dir($path);
while (($entry = $dir->read()) !== false) {
if ($entry === '.' || $entry === '..') {
continue;
}
$fullPath = $path . DIRECTORY_SEPARATOR . $entry;
if (is_dir($fullPath)) {
$result[] = $entry;
// Appel récursif pour obtenir des sous-répertoires
$result = array_merge($result, getAllSubDirsRecursive($fullPath));
}
}
$dir->close();
return $result;
}
$dirs = getAllSubDirsRecursive('/var/www/html');
print_r($dirs);
?>
Ce code obtiendra récursivement des sous-répertoires à tous les niveaux pour faciliter la gestion des structures de répertoires plus complexes.