web-dev-qa-db-fra.com

Utilisation de scandir () pour rechercher des dossiers dans un répertoire (PHP)

J'utilise ce morceau de code:

$target = 'extracted/' . $name[0];  
$scan = scandir($target);

Pour analyser le répertoire d’un dossier utilisé pour les téléchargements Zip. Je veux pouvoir trouver tous les dossiers dans mon dossier $target afin de pouvoir les supprimer ainsi que leur contenu, en ne laissant que les fichiers dans le répertoire $target

Une fois que j'ai renvoyé le contenu du dossier, je ne sais pas comment différencier les dossiers des fichiers pour pouvoir supprimer les dossiers. 

De plus, on m'a dit que la fonction rmdir() ne peut pas supprimer les dossiers contenant du contenu. Y a-t-il un moyen de contourner ce problème?

Merci, Ben.

31
Ben McRae

Pour déterminer si vous avez ou non un dossier ou un fichier, utilisez les fonctions is_dir() et is_file().

Par exemple:

 $ path = 'extrait /'. $ name [0]; 
 $ results = scandir ($ path); 

 foreach ($ results as $ result) {
 if ($ result === '.' ou $ result === '..') continue; 

 if (is_dir ($ path. '/'. $ result)) {
 // code à utiliser si répertoire 
 } 
} 
59
travis-146

Mieux vaut utiliser DirectoryIterator

$path = 'extracted'; // '.' for current
foreach (new DirectoryIterator($path) as $file) {
    if ($file->isDot()) continue;

    if ($file->isDir()) {
        print $file->getFilename() . '<br />';
    }
}
36
Dominic

Tout d’abord, rmdir () ne peut pas supprimer un dossier avec un contenu. Si le mode sans échec est désactivé, vous pouvez utiliser les éléments suivants.

exec("rm -rf folder/"); 

Regardez aussi is_dir ()/is_file () ou mieux encore le PHP SPL .

3
Hawk Kroeger
$directories = scandir('images');
foreach($directories as $directory){
    if($directory=='.' or $directory=='..' ){
        echo 'dot';
    }else{
            if(is_dir($directory)){
                  echo $directory .'<br />';
            }
    }
} 

une version plus simple et peut-être plus rapide

2
alex

scandir va scanner tout le répertoire, vous pouvez filtrer manuellement.

mais si vous êtes paresseux comme moi, utilisez glob

$scan = glob($target."/*",GLOB_ONLYDIR);

et il sortira un tableau de tous vos répertoires de votre cible.

1
ジェンネ

Vous vouliez également supprimer des éléments s'ils se trouvaient dans ce répertoire. rmdir ne vous permet pas de supprimer des répertoires contenant des fichiers. Mais il y a une simple solution.

array_map('unlink', glob($target.'/*/*'));
array_map('rmdir',glob($target."/*",GLOB_ONLYDIR));

Tout d'abord, il va dissocier tous les fichiers de tous les sous-répertoires.
Deuxièmement, tous les répertoires seront supprimés, car ils ne contiennent aucun fichier.

Si vous avez des sous-sous-répertoires, alors vous devriez ajouter 2 autres lignes comme ceci:

array_map('unlink', glob($target.'/*/*/*')); //remove sub-sub-files
array_map('rmdir',glob($target."/*/*",GLOB_ONLYDIR)); //remove sub-sub-directories

array_map('unlink', glob($target.'/*/*')); //remove sub-files
array_map('rmdir',glob($target."/*",GLOB_ONLYDIR)); //remove sub-directories
0
ジェンネ

Le moyen rapide et sale:

$folders = glob("<path>/*", GLOB_ONLYDIR);

Une solution plus polyvalente et orientée objet, inspirée des réponses précédentes à l'aide de DirectoryIterator mais légèrement plus concise et plus générale:

    $path = '<path>';
    $folders = [];

    foreach (new \DirectoryIterator($path) as $file)
    {
        if (!$file->isDot() && $file->isDir())
        {
            $folders[] = $file;
        }
    }
0
Andreas Bergström

Pour obtenir tous les fichiers de tous les sous-sous-dossiers

function myfunction($dir){

foreach ($dir as $dirname => $file) {

if(is_dir($file) &&  $file != '.' &&  $file != '..' ) { 

     // echo $file;
      $newDir = scandir($file);
      myfunction($newDir);

    }elseif($file !='.' && $file != '..'){

        echo "<br>File name is ---";
        echo  $file;
    }

} // end foreach


}  //function ends 

$dirpass = scandir($mypath3); // set directory
echo myfunction($dirpass); //     pass directory

Nous obtiendrons le résultat comme ci-dessous

File name is ----->index.PHP
File name is -----> 100000045   Invoices   Sales   Magento Admin.png
File name is -----> 100000142   Orders   Sales   Magento Admin(1).png
File name is -----> 100000142   Orders   Sales   Magento Admin.png
File name is ----->hrc-siberian-tiger-2-jpg_21253111.jpg
File name is ----->images (3rd copy).jpeg
File name is ----->images (4th copy).jpeg
File name is ----->images (5th copy).jpeg
File name is ----->images (another copy).jpeg
File name is ----->images (copy).jpeg
File name is ----->images.jpeg
File name is ----->JPEG_example_JPG_RIP_100.jpg
File name is ----->preload
File name is ----->Stonehenge (3rd copy).jpg
File name is ----->Stonehenge (4th copy).jpg
File name is ----->Stonehenge (5th copy).jpg
File name is ----->Stonehenge (another copy).jpg
File name is ----->Stonehenge (copy).jpg
File name is ----->Stonehenge.jpg
0
inrsaurabh