如何在 Mac 上获取 PHP 文件的实际创建时间



当您在 Finder 中选择一个文件并在 Mac 上点击 cmd+i 时,您会得到文件(实际(创建的时间,以及上次修改的时间。

我的问题很简单:如何使用 PHP 从已经存在的 Mac 文件中获取实际创建时间?

现在,在研究了这个话题之后,我读过一些帖子,说这是不可能的,但在我的世界里,"不可能"只意味着一件事需要更长的时间才能完成。欢迎解决方法和黑客。

我不想要 mtime 或 ctime 相关的建议,因为这些只能在上次更新或修改文件时访问。

此外,我们可能只在这里谈论Mac,但也欢迎独立于操作系统的解决方案 - 如果它们真的适用于所有系统。

这个脚本是我管理的最好的脚本,它包装了BSD上可用的命令行stat工具,以提供inode birthtime属性。

// stat.php
$filename = 'test';
$stat = stat($filename);
date_default_timezone_set('America/Denver');
echo strftime("atime: %H:%M:%Sn", $stat['atime']);
echo strftime("mtime: %H:%M:%Sn", $stat['mtime']);
echo strftime("ctime: %H:%M:%Sn", $stat['ctime']);
if ($handle = popen('stat -f %B ' . escapeshellarg($filename), 'r')) {
    $btime = trim(fread($handle, 100));
    echo strftime("btime: %H:%M:%Sn", $btime);
    pclose($handle);
}

命令行stat工具读取atime,ctime,mtime与PHP的stat完全相同,但提供了第四个"inode出生时间"参数。BSD stat()系统调用在可用时返回st_birthtime,但我还没有找到将其本地公开给 PHP 的方法。

$ touch test # create a file
$ stat test
..."May 30 06:16:22 2011" "May 30 06:16:22 2011" "May 30 06:16:22 2011" "May 30 06:16:11 2011"...
$ open .
$ touch test # about one minute later
$ stat test
..."May 30 06:17:04 2011" "May 30 06:17:04 2011" "May 30 06:17:04 2011" "May 30 06:16:11 2011"...
$ php stat.php
atime: 06:52:48
mtime: 06:17:04
ctime: 06:17:04
btime: 06:16:11

以下命令仅返回 inode 出生时间的 unix 时间戳,这是我迄今为止发现的最好的时间戳。你可以用 popen(( 或 proc_open(( 运行它

$ stat -f %B test
1306757771

MacOS X 具有 stat() 系统调用的扩展版本,该调用也返回文件创建时间,但默认情况下未启用(即使在本机 C 代码中也是如此(,因为生成的结构的字段顺序与标准 POSIX 版本中的顺序不同。

在 10.6 中,该版本由 /usr/lib/libc.dylib 中的(隐藏(符号_stat$INODE64提供,如果定义了宏_DARWIN_FEATURE_64_BIT_INODE,该符号将自动替换为stat

如果您能弄清楚如何从动态库中访问该符号,那么工作就完成了!

唯一最接近的是 filemtime 函数的上次更新时间。

相关内容

  • 没有找到相关文章

最新更新