Использование scandir() для поиска папок в каталоге (PHP)
Я использую этот код кода:
$target = 'extracted/' . $name[0];
$scan = scandir($target);
Сканировать каталог папки, который используется для загрузки zip. Я хочу, чтобы найти все папки внутри моей папки $target
, чтобы я мог удалить их и их содержимое, оставив только файлы в каталоге $target
.
Как только я вернул содержимое папки, я не знаю, как различать папки и файлы, чтобы иметь возможность удалять папки.
Кроме того, мне сказали, что функция rmdir()
не может удалять папки, содержащие контент внутри них, существует ли какой-либо способ?
Спасибо, Бен.
Ответы
Ответ 1
Чтобы определить, есть ли у вас папка или файл, используйте функции is_dir()
и is_file()
Например:
$path = 'extracted/' . $name[0];
$results = scandir($path);
foreach ($results as $result) {
if ($result === '.' or $result === '..') continue;
if (is_dir($path . '/' . $result)) {
//code to use if directory
}
}
Ответ 2
Лучше использовать DirectoryIterator
$path = 'extracted'; // '.' for current
foreach (new DirectoryIterator($path) as $file) {
if ($file->isDot()) continue;
if ($file->isDir()) {
print $file->getFilename() . '<br />';
}
}
Ответ 3
Во-первых, rmdir() не может удалить папку с содержимым. Если безопасный режим отключен, вы можете использовать следующее.
exec("rm -rf folder/");
Также посмотрите на is_dir()/is_file() или еще лучше PHP SPL.
Ответ 4
$directories = scandir('images');
foreach($directories as $directory){
if($directory=='.' or $directory=='..' ){
echo 'dot';
}else{
if(is_dir($directory)){
echo $directory .'<br />';
}
}
}
более простая и, возможно, более быстрая версия
Ответ 5
scandir сканирует весь каталог, вы можете вручную фильтровать.
но если вы ленивы, как я, то используйте glob
$scan = glob($target."/*",GLOB_ONLYDIR);
и он выведет массив из всех ваших каталогов вашей цели.
Ответ 6
Вы также хотели удалить элементы, если они были внутри этого каталога. 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
Ответ 7
Быстрый и грязный способ:
$folders = glob("<path>/*", GLOB_ONLYDIR);
Более универсальное и объектно-ориентированное решение, основанное на более ранних ответах с использованием DirectoryIterator, но немного более сжатое и общее назначение:
$path = '<path>';
$folders = [];
foreach (new \DirectoryIterator($path) as $file)
{
if (!$file->isDot() && $file->isDir())
{
$folders[] = $file;
}
}
Ответ 8
Чтобы получить все файлы во всех вспомогательных папках
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