【问题标题】:PHP - how to test / check if directory / folder contains old file / file older than?PHP - 如何测试/检查目录/文件夹是否包含旧文件/文件?
【发布时间】:2016-12-01 04:15:19
【问题描述】:

奇怪的是,当我尝试用谷歌搜索这个问题时,输入类似于这个问题的查询没有任何有用的弹出,甚至没有关闭。

现在我不是寻找一种解决方案,您可以扫描或打开目录并逐个文件读取其内容。对于那些寻找这种不可靠循环的人,请检查这些功能:scandir(...) 一次加载所有内容然后循环它,opendir(...)readdir(...)stat(...)['mtime'] 逐个文件执行,并可能对完成的数量设置一些限制,并使其至少更安全一些...

我想知道的是 PHP 中是否有一些东西可以检查/测试,以某种简单的方式,一个文件夹/目录是否包含早于 [sometime] 的文件,或者甚至有多少这样的文件没有任何类型的“手动”通关?

PS:我见过一些shell_execs,但这似乎不太跨操作系统...

【问题讨论】:

  • 该手册包含来自“dds dot nl 的偏执狂”的评论,可能与您的需求相关:php.net/manual/en/function.filemtime.php
  • @markdwhite 真的很有趣,但这与我想要的几乎相反 - 最新的文件更改,而不是最旧的 - 这对我来说已经足够了 :-)
  • @jave.web 因此,您正在寻找一个标准的独立于平台的 PHP 命令,该命令将以一种奇特的方式扫描目录,而无需您手动进行,也无需循环;因此,如果在某个日期之前至少创建了一个文件或此类文件的“数量”,它应该返回“true”或“false”?不,没有这样的功能。您的“跨操作系统”限制导致唯一的答案“循环遍历文件”。您可以在此处查看示例:stackoverflow.com/a/2205784/4621324
  • 如果您不想在代码中看到显式循环,这是另一种方法:stackoverflow.com/a/3298787/4621324
  • @Axalix 好的,感谢您提供的信息,无论如何,这不是关于显式循环,而是不必遍历所有文件,可能是 maaaany,文件。是否至少有适用于 Unix、Linux、Windows 的跨操作系统解决方案? (适用于所有生产使用 Windows 的命令,另一个适用于所有 Linux 的命令......我想你明白了吗?)

标签: php performance file directory last-modified


【解决方案1】:

显然没有内置函数可以做到这一点,因为这太具体了。您必须以一种或另一种方式自己完成,就像您非常喜欢的那些 shell 函数在内部执行一样。

编写一个执行此操作的函数,以便您可以在需要的地方使用它。自然地,PHP 提供了一堆函数,使整个事情变得更小,并且可能更快。例如,您可以这样做:

function folder_has_older_file($folder, $time)
{
    return count(array_filter(array_map('filemtime', glob("$folder/*")), function ($a) use ($time) { return $a < $time; })) > 0;
}

【讨论】:

  • 我明白了... 注意:glob 基本上是有条件的 scandir - 所以这不是我所说的我要寻找的。然而,有趣的是通过可能针对性能进行优化的函数来实现这一点的想法(如果不是现在,将来有可能发生)。所以我不会接受它作为答案,但要为这个想法竖起大拇指;)
  • @jave.web 它总是会在某个级别扫描目录,没有办法绕过它。
  • 这很可悲,但如果是这样,我宁愿直接在系统级别完成(虽然通过 PHP 调用)。
【解决方案2】:

您可以使用filectime(path)filemtime(path) 函数来检查文件或文件夹的创建时间。它会返回unixtime,然后你可以比较一下

【讨论】:

  • 它仍然需要遍历文件才能得到答案——正如我在 bold 中所说的那样——这不是我想要的,因为我知道该怎么做:-)
猜你喜欢
  • 2014-05-10
  • 2017-04-28
  • 2011-05-04
  • 1970-01-01
  • 2014-10-29
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多