удалить json-файл с помощью php

0

Я пишу 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))
{

}

Я получаю ошибку разрешения

Может быть, кто-то знает, почему я получаю эту ошибку

Теги:

2 ответа

3
Лучший ответ

Гораздо проще использовать свой собственный 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 выбора выполнять операции с файлами.

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); 
  }
  • 0
    Я хочу удалить папку с ее содержимым
  • 0
    Проверьте мой отредактированный ответ.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню