Как получить фактическое время создания файла в PHP на Mac?
Когда вы выбираете файл в Finder и нажимаете cmd + я на Mac, вы получаете время, когда файл был создан (фактически), и время последнего изменения.
Мой вопрос просто: как я могу получить фактическое время создания из уже существующего файла Mac с PHP?
Теперь, исследуя тему, я прочитал сообщения, которые говорят, что это невозможно, но в моем мире "невозможно" означает только то, что вещь занимает немного больше времени. Обходные решения и хаки приветствуются.
Мне не нужны советы, связанные с mtime или ctime, поскольку они имеют доступ только в последний раз, когда файл был обновлен или изменен.
Кроме того, мы, вероятно, говорим о Mac только здесь, но независимые от ОС решения также приветствуются - если они действительно работают на всех системах.
Этот script лучший, который мне удалось, который обертывает инструмент командной строки stat
, доступный в BSD, чтобы придумать атрибут рождения inode.
// stat.php
$filename = 'test';
$stat = stat($filename);
date_default_timezone_set('America/Denver');
echo strftime("atime: %H:%M:%S\n", $stat['atime']);
echo strftime("mtime: %H:%M:%S\n", $stat['mtime']);
echo strftime("ctime: %H:%M:%S\n", $stat['ctime']);
if ($handle = popen('stat -f %B ' . escapeshellarg($filename), 'r')) {
$btime = trim(fread($handle, 100));
echo strftime("btime: %H:%M:%S\n", $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
Следующая команда возвращает временную метку unix только времени рождения inode, и это лучшее, что я нашел до сих пор. Вы можете запустить его с помощью popen() или proc_open()
$ stat -f %B test
1306757771
MacOS X имеет расширенную версию системного вызова stat()
, который также возвращает время создания файла, но по умолчанию он не включен (даже в исходном C-коде), поскольку результирующая структура имеет свои поля в другом порядке для тех в стандартной версии POSIX.
В версии 10.6 эта версия предоставляется (скрытым) символом _stat$INODE64
в /usr/lib/libc.dylib
, который автоматически заменяется на stat
, если определен макрос _DARWIN_FEATURE_64_BIT_INODE
.
Если вы можете выяснить, как получить доступ к этому символу из динамической библиотеки, выполните задание!