Как получить фактическое время создания файла в PHP на Mac?

127
16

Когда вы выбираете файл в Finder и нажимаете cmd + я на Mac, вы получаете время, когда файл был создан (фактически), и время последнего изменения.


Мой вопрос просто: как я могу получить фактическое время создания из уже существующего файла Mac с PHP?


Теперь, исследуя тему, я прочитал сообщения, которые говорят, что это невозможно, но в моем мире "невозможно" означает только то, что вещь занимает немного больше времени. Обходные решения и хаки приветствуются.


Мне не нужны советы, связанные с mtime или ctime, поскольку они имеют доступ только в последний раз, когда файл был обновлен или изменен.


Кроме того, мы, вероятно, говорим о Mac только здесь, но независимые от ОС решения также приветствуются - если они действительно работают на всех системах.

спросил(а) 2021-01-19T14:38:06+03:00 6 месяцев, 1 неделя назад
1
Решение
126

Этот 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

ответил(а) 2021-01-19T14:38:06+03:00 6 месяцев, 1 неделя назад
79

MacOS X имеет расширенную версию системного вызова stat(), который также возвращает время создания файла, но по умолчанию он не включен (даже в исходном C-коде), поскольку результирующая структура имеет свои поля в другом порядке для тех в стандартной версии POSIX.


В версии 10.6 эта версия предоставляется (скрытым) символом _stat$INODE64 в /usr/lib/libc.dylib, который автоматически заменяется на stat, если определен макрос _DARWIN_FEATURE_64_BIT_INODE.

Если вы можете выяснить, как получить доступ к этому символу из динамической библиотеки, выполните задание!

ответил(а) 2021-01-19T14:38:06+03:00 6 месяцев, 1 неделя назад
45

Единственное, что вы можете получить, это последнее обновленное время с помощью функции filemtime.

ответил(а) 2021-01-19T14:38:06+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема