x次后自动删除所有文件

时间:2009-12-17 12:34:16

标签: php file delete-file

如何在x-time之后自动删除子目录下的所有文件(假设在24小时之后) - 不使用来自服务器或pl的cronjob命令。你怎么能只使用PHP代码或只是访问页面而不点击某些内容并且命令自动运行。

7 个答案:

答案 0 :(得分:15)

我的第一个回答对最后评论的回复。我打算编写代码示例,所以我创建了另一个答案,而不是再添加一个评论。

要删除具有自定义扩展名的文件,您必须实现代码:

<?php
  $path = dirname(__FILE__).'/files';
  if ($handle = opendir($path)) {

    while (false !== ($file = readdir($handle))) {
        if ((time()-filectime($path.'/'.$file)) < 86400) {  // 86400 = 60*60*24
          if (preg_match('/\.txt$/i', $file)) {
            unlink($path.'/'.$file);
          }
        }
    }
  }
?>

评论:1。此示例使用正则表达式/\.txt$/i,这意味着只会删除扩展名为txt的文件。 '$'符号表示该文件名必须以字符串'.txt'结尾。标志'i'表示,该比较将不区分大小写。有关preg_match()功能的更多信息。

此外,您可以使用strripos()功能搜索具有特定扩展名的文件。这是代码片段:

<?php
  $path = dirname(__FILE__).'/files';
  if ($handle = opendir($path)) {

    while (false !== ($file = readdir($handle))) {
        if ((time()-filectime($path.'/'.$file)) < 86400) {  // 86400 = 60*60*24
          if (strripos($file, '.txt') !== false) {
            unlink($path.'/'.$file);
          }
        }
    }
  }
?>

评论:这个例子似乎更明显。 strripos()的结果也可以通过两个函数的组合来实现:strrpos(strtolower($file), '.txt'),但是,恕我直言,在代码中使用较少的函数使其更具可读性和更小是一个很好的规则。请仔细阅读strripos()函数页面上的警告(返回值块)。

一个更重要的通知:如果您使用的是UNIX系统,由于文件权限,文件删除可能会失败。您可以查看有关chmod()功能的手册。

祝你好运。

答案 1 :(得分:8)

您可以使用PHP核心函数filectime()unlink()来检查文件创建时间并删除其文件/文件。

EDIT。 代码示例:

  if ($handle = opendir('/path/to/files')) {

    while (false !== ($file = readdir($handle))) {
        if (filectime($file)< (time()-86400)) {  // 86400 = 60*60*24
          unlink($file);
        }
    }
  }

答案 2 :(得分:1)

以下是使用GLOB的另一个示例,它将删除任何文件

$files = glob('path/to/your/files/*');

foreach($files as $file) { // iterate files
    // if file creation time is more than 5 minutes
    if ((time() - filectime($file)) > 3600) {  // 86400 = 60*60*24
        unlink($file);
    }
}

或者如果您想要排除某些文件

$files = preg_grep('#\.txt#', glob('/path/to/your/files/*'), PREG_GREP_INVERT);

答案 3 :(得分:1)

在尝试使用这些示例后,我遇到了几个问题:

  1. 比较运算符应大于,不小于
  2. filemtime返回修改时间。 filectime是文件的inode数据发生变化的时间;也就是说,当更新inode的权限,所有者,组或其他元数据时,可能会导致意外结果
  3. 我更改了示例以使用filemtime并修复了比较,如下所示:

    <?php
      $path = dirname(__FILE__).'/files';
      if ($handle = opendir($path)) {
    
        while (false !== ($file = readdir($handle))) {
            if ((time()-filemtime($path.'/'.$file)) > 86400) {  // 86400 = 60*60*24
              if (preg_match('/\.txt$/i', $file)) {
                unlink($path.'/'.$file);
              }
            }
        }
      }
    ?>
    

答案 4 :(得分:0)

我使用shell AT命令,它就像一个cronjob

PHP:

exec("echo rm /somedir/somefile.ext|at now +24 hours");

答案 5 :(得分:0)

function deleteCachedData($hours=24)
{
    $files = glob(ROOTDIR.DIRECTORY_SEPARATOR.'tmp'.DIRECTORY_SEPARATOR.'*.txt');
    foreach($files as $file) {
        if(is_file($file) && (time() - filectime($file)) > $hours*3600) {
            unlink($file);
        }
    }

}

答案 6 :(得分:0)

$path = 'folder/subfolder/';

/* foreach (glob($path.'.txt') as $file) { */
foreach (glob($path.'*') as $file) {

    if(time() - filectime($file) > 86400){
      unlink($file);
    }
}