我在生成的文件夹中写了一个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): / Applications / MAMP / htdocs /....中的目录不为空 46
如果我删除
if(is_file($file))
{
}
我收到了权限错误
也许有人知道我为什么会收到这个错误
答案 0 :(得分:3)
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);
}
答案 1 :(得分:3)
当涉及到这样的事情时,使用本机操作系统来删除目录要容易得多,所以你不必编写一个可怕的循环可能有一些你可能会遗漏的边缘情况< / em>然后最终删除你不应该拥有的东西!
$path = 'your/path/here';
if (PHP_OS !== 'WINDOWS')
{
exec(sprintf('rm -rf %s', $path));
}
else
{
exec(sprintf('rd /s /q %s', $path));
}
当然,根据您的需要量身定制。如果你想避免函数调用的开销,你也可以使用backtick operator(在这种情况下可以忽略不计)。将escape_shell_arg用于$path
变量也是一个不错的主意。
对于单行:
exec(sprintf((PHP_OS === 'WINDOWS') ? 'rd /s /q %s' : 'rm -rf %s', escape_shell_arg($path)));
无论如何,有时让选择的操作系统执行文件操作会更容易。