Как узнать фактическое время создания файла в PHP на Mac? - PullRequest
7 голосов
/ 30 мая 2011

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

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

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

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

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

Ответы [ 3 ]

8 голосов
/ 30 мая 2011

Этот скрипт - лучший из всех, которыми я управлял. Он включает в себя инструмент командной строки 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, но имеет четвертый параметр «время рождения 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 только время рождения инода, которое является лучшим, которое я нашел до сих пор.Вы можете запустить его с помощью popen () или proc_open ()

$ stat -f %B test
1306757771
2 голосов
/ 30 мая 2011

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

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

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

0 голосов
/ 30 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...