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.
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 } }
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 />';
}
}
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 .
$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
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.
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
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;
}
}
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