【问题标题】:Delete old files - an hour ago or more than an hour ago [duplicate]删除旧文件 - 一个小时前或一个多小时前 [重复]
【发布时间】:2012-07-07 13:37:16
【问题描述】:

下面的代码会删除名为“Images”的文件夹中的所有文件。没有抱怨一切正常,但是有没有办法删除一个小时前或一个小时前创建的文件?请告诉我如何,我正在尝试边做边学,拜托。尝试重复使用下面的相同代码以更好地理解并帮助世界各地的 PHP 程序员用户

<?php
define('PATH', 'Images/');

function destroy($dir) {
    $mydir = opendir($dir);
    while(false !== ($file = readdir($mydir))) {
        if($file != "." && $file != "..") {
            chmod($dir.$file, 0777);
            if(is_dir($dir.$file)) {
                chdir('.');
                destroy($dir.$file.'/');
                rmdir($dir.$file) or DIE("couldn't delete $dir$file<br />");
            }
            else
                unlink($dir.$file) or DIE("couldn't delete $dir$file<br />");
        }
    }
    closedir($mydir);
}
destroy(PATH);
echo 'all done.';

【问题讨论】:

  • 在确保您不在目录中以选择性地删除文件后,请查看使用filemtime
  • @Aaron: filemtime 返回文件最后修改的时间,而不是文件创建时间。
  • Aaron,如果您不介意使用我发布的相同代码来举例说明,有什么改变吗?我会接受你的回答,以防它达到预期,请让我更好地理解事情,也许可以帮助其他新程序员,而不是仅仅保持梦想
  • Jocelyn 什么是更好或正确的方法?请给我看看好吗
  • @Jocelyn 我读这个问题太快了,尽管如果这些文件是刚刚创建的并且事后没有修改,它仍然可以工作,因为它仍然会返回正确的时间。还取决于用于获取创建日期的文件系统。

标签: php


【解决方案1】:

您可以使用filemtime()filectime()。另外,不能使用rmdir(),因为要删除特定文件

你必须做什么

  1. date("U",filectime($file) - 返回您的文件在 Unix 纪元时间最后一次修改的时间。

  2. unlink($file) - 删除指定的文件。您必须使用它而不是 rmdir()

  3. 需要ifwhile/for 语句:

    while($file)
    {
        if(date("U",filectime($file) <= time() - 3600)
        {
            unlink($file)
        }
    }
    

然后将其添加到您的脚本中:

function destroy($dir) {
$mydir = opendir($dir);
while($file = readdir($mydir)) {
    if($file != "." && $file != "..") {
        chmod($dir.$file, 0777);
        if(is_dir($dir.$file)) {
            chdir('.');
            while($dir.$file) {
                if(date("U",filectime($file) >= time() - 3600)
                {
                    unlink($dir.$file)
                }
            }

        }
        else
            unlink($dir.$file) or DIE("couldn't delete $dir$file<br />");
    }
}
closedir($mydir);
}

希望对你有帮助。

记住:

  • 没有办法在 Unix/Php 中获取文件创建时间
  • 如果文件上次更改时间超过或等于一小时前,则当前 if 语句返回 true

【讨论】:

  • 我用的是mac,但是web主机用的是Unix,你能把那个代码植入我贴的代码里面看看应该怎么样,那我去接你
  • 好的,给我 5 分钟。
  • @user1508409 您可以尝试我编辑的答案中的解决方案。
  • 我做了,但它说:语法错误,意外'{'
  • 嘿嘿嘿!我是来帮你删除超过一小时前的文件的,我不是你的私人助理。试着找出自己当前的问题是什么。如果我在您的问题中帮助您解决了您的问题,请点赞或接受。我几乎可以肯定您必须检查以前的脚本,我的答案中的脚本包含{的确切数量。
【解决方案2】:

我不会为此使用 php,而是使用一个简单的 shell 脚本和一个 cron 作业(至少在 linux 上)。

如果你在 linux 上,脚本看起来像这样:

#! /bin/sh
find /path/to/Images/ -mmin +60 -exec rm -f {} \;     // modification date, not creation date...

我会使用 cron 每小时自动运行一次。

为了完成,cron 条目如下所示:

0 * * * * /path/to/shell/script.sh    // run script every whole hour

不是对问题的直接答案,但对于评论来说太长了,也许是一个可能的解决方案,因为重复问题中的所有答案也都集中在 php 上......

【讨论】:

  • 这个脚本会在ubuntu服务器上运行吗?
【解决方案3】:

在 Unix 中,无法检索创建时间,只能使用 filectime 检索最后修改日期

但是,如果您使用的是 Windows 系统,则完全相反。使用相同的方法 filectime,您将检索创建时间,而不是最后更改的时间。

【讨论】:

  • Hyunmin Kim,在我发布的代码中植入 filectime,我会接受你的回答作为奖励,请你看起来像专家
  • 这仅适用于 Windows,但基本思想是:将时间转换为 DateTime 对象。使用 DateTime::diff() (php.net/manual/en/datetime.diff.php) 与当前时间比较
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-02
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多