Я пишу json файл внутри сгенерированной папки. Через час я хочу автоматически удалить папку с ее содержимым. Я пытался:
$dir = "../tmpDir";
$cdir = scandir($dir);
foreach ($cdir as $key => $value)
{
if (!in_array($value,array(".","..")))
{
if (is_dir($dir.'/'.$value))
{
if(filectime($dir.'/'.$value)< (time()-3600))
{ // after 1 hour
$files = glob($dir.'/'.$value); // get all file names
foreach($files as $file)
{ // iterate files
if(is_file($file))
{
unlink($file); // delete file
}
}
rmdir($dir.'/'.$value);
/*destroy the session if the folder is deleted*/
if(isset($_SESSION["dirname"]) && $_SESSION["dirname"] == $value)
{
session_unset(); // unset $_SESSION variable for the run-time
session_destroy(); // destroy session data in storage
}
}
}
}
}
Я получаю: rmdir (../tmpDir/1488268867): каталог не пуст в /Приложения /MAMP/htdocs/.... в строке 46
если я удалю
if(is_file($file))
{
}
Я получаю ошибку разрешения
Может быть, кто-то знает, почему я получаю эту ошибку
Гораздо проще использовать свой собственный O/S для удаления каталога, когда дело доходит до таких вещей, так что вам не нужно писать ужасный цикл, который может иметь некоторые кромки, которые вы могли бы пропустить, а затем в конечном итоге удалить вещи, которые вы не должно быть!
$path = 'your/path/here';
if (PHP_OS !== 'WINDOWS')
{
exec(sprintf('rm -rf %s', $path));
}
else
{
exec(sprintf('rd /s /q %s', $path));
}
Конечно, приложите это к вашим потребностям. Вы также можете использовать оператор backtick, если хотите избежать накладных расходов на вызов функции (в любом случае это незначительно). Также полезно использовать escape_shell_arg для переменной $path
.
Для однострочного:
exec(sprintf((PHP_OS === 'WINDOWS') ? 'rd /s /q %s' : 'rm -rf %s', escape_shell_arg($path)));
Независимо от того, иногда проще позволить O/S выбора выполнять операции с файлами.
rmdir()
удаляет каталог, если вы хотите удалить файл, тогда вы должны использовать функцию unlink()
Правильный aporach будет использовать DirectoryIterator
или glob()
и перебирать файлы, а затем удалять их, и после этого вы можете удалить пустую директорию.
Вы также можете вызвать системную команду rm -rf direcory_name
с помощью exec()
или shell_exec()
Полезные ссылки:
Я нашел довольно полезную функцию на php.net, которая также удаляет скрытые файлы
public function delTree($dir) {
$files = array_diff(scandir($dir), array('.','..'));
foreach ($files as $file) {
(is_dir("$dir/$file")) ? delTree("$dir/$file") : unlink("$dir/$file");
}
return rmdir($dir);
}