Использование scandir () для поиска папок в каталоге (PHP)

Я использую этот код кода:

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

Сканировать каталог папки, которая используется для загрузки ZIP-файлов. Я хочу, чтобы найти все папки внутри моей $target папки $target чтобы я мог удалить их и их содержимое, оставив только файлы в $target каталоге $target .

После того как я вернул содержимое папки, я не знаю, как различать папки и файлы, чтобы иметь возможность удалять папки.

Кроме того, мне сказали, что функция rmdir() не может удалять папки, у которых есть контент внутри них, есть ли способ обойти это?

Спасибо, Бен.

Solutions Collecting From Web of "Использование scandir () для поиска папок в каталоге (PHP)"

Чтобы определить, есть ли у вас папка или файл, используйте функции is_dir() и is_file()

Например:

 $ path = 'extract /'.  $ Имя [0];
 $ results = scandir ($ path);

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

     if (is_dir ($ path. '/'. $ result)) {
         // код для использования, если каталог
     }
 }

Лучше использовать DirectoryIterator

 $path = 'extracted'; // '.' for current foreach (new DirectoryIterator($path) as $file) { if ($file->isDot()) continue; if ($file->isDir()) { print $file->getFilename() . '<br />'; } } 

Во-первых, rmdir () не может удалить папку с содержимым. Если безопасный режим отключен, вы можете использовать следующее.

 exec("rm -rf folder/"); 

Также посмотрите на is_dir () / is_file () или даже лучше PHP SPL .

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

более простая и, возможно, более быстрая версия

scandir сканирует весь каталог, вы можете вручную фильтровать.

но если вы ленивы, как я, то используйте glob

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

и он выведет массив из всех ваших каталогов вашей цели.

Вы также хотели удалить элементы, если они были внутри этого каталога. rmdir не позволяет удалять каталоги, содержащие файлы. Но есть простое решение.

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

Сначала он отключит все файлы во всех подкаталогах.
Во-вторых, он удалит все каталоги, потому что они не содержат файлов.

Если у вас есть суб-подкаталоги, вы должны добавить еще две строки:

 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 

Быстрый и грязный способ:

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

Более универсальное и объектно-ориентированное решение, основанное на более ранних ответах с использованием DirectoryIterator, но немного более сжатое и общее назначение:

  $path = '<path>'; $folders = []; foreach (new \DirectoryIterator($path) as $file) { if (!$file->isDot() && $file->isDir()) { $folders[] = $file; } } 

Чтобы получить все файлы во всех дочерних подпапках

 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 

Мы получим результат, как показано ниже (имена плз-плз плз)

 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