PHP: как узнать дату создания файла?

84

Я читаю папку с большим количеством файлов.

Как узнать дату создания файла. Я не вижу прямой функции, чтобы получить это.

Есть filemtimeи filectime.

А если файл не был изменен, что будет?

зод
источник

Ответы:

111

Используйте filectime . Для Windows он вернет время создания , а для Unix - время изменения, которое является лучшим из возможных, потому что в Unix нет времени создания (в большинстве файловых систем).

Также обратите внимание, что в некоторых текстах Unix ctime файла называется временем создания файла. Это не правильно. В большинстве файловых систем Unix нет времени для создания файлов Unix.

Алин Пуркару
источник
Возвращает время последнего изменения файла или FALSE в случае ошибки. Время возвращается в виде отметки времени Unix.
zod
@zod Если вы прочтете немного дальше, чем первые строки, вы можете понять больше. Зайдите тоже немного в комментарии.
Алин Пуркару
Это не дата создания. Это все, что я сказал :-)
zod
11
filemtimeдля Linux лучше и точнее, так как filectimeпри изменении владельца права доступа и другие операции. У вас будет больше шансов получить время создания в Linux, используяfilemtime
Федор РЫХТИК
Было бы быстрее запустить эту функцию php или вытащить поле MySQL для последнего обновления? В моем случае путь к изображению хранится в БД и уже выполняется запрос выбора
drooh
17

Это пример кода, взятый из документации PHP здесь: https://www.php.net/manual/en/function.filemtime.php

// outputs e.g.  somefile.txt was last changed: December 29 2002 22:16:23.

$filename = 'somefile.txt';

if (file_exists($filename)) {

    echo "$filename was last modified: " . date ("F d Y H:i:s.", filemtime($filename));
}

Код указывает имя файла, затем проверяет, существует ли оно, а затем отображает время модификации с помощью filemtime().

filemtime() принимает 1 параметр, который является путем к файлу, он может быть относительным или абсолютным.

Ракеш Донгарвар
источник
4
Ракеш, пожалуйста, объясните свой код, а не просто размещайте код и ожидайте, что люди его поймут.
Persijn
2
Хотя это сообщение, содержащее только код, может дать ответ на вопрос, пожалуйста, объясните, почему это так. Это поможет будущим читателям оценить ответ для своей ситуации.
Том Брунберг
1
Функция filemtime()возвращает время модификации.
Стефан
Майкл, поскольку значение функции filemtime () неочевидно, код заслуживает некоторого комментария.
Radium
Код указывает имя файла, затем проверяет, существует ли оно, а затем отображает время модификации с помощью filemtime (). filemtime () принимает 1 параметр, который является путем к файлу, он может быть относительным или абсолютным. Пример выше скопирован из документации PHP здесь php.net/manual/en/function.filemtime.php
Харви Добсон,
8

К сожалению, если вы работаете в Linux, вы не можете получить доступ к информации, так как сохраняется только дата последнего изменения.

Это немного зависит от вашей файловой системы. Я знаю, что ext2 и ext3 не поддерживают время создания, но я думаю, что ext4 поддерживает.

Мруустер
источник
-3

Я знаю, что эта тема очень старая, но, если кто-то ищет ответ, как я, я публикую свое решение.

Это решение работает, ЕСЛИ вы не возражаете, если в начале файла есть дополнительные данные.

По сути, идея состоит в том, чтобы, если файл не существует, создать его и добавить текущую дату в первую строку. Затем вы можете прочитать первую строку с помощью fgets(fopen($file, 'r')), превратить ее в DateTimeобъект или что-то еще (вы, очевидно, можете использовать ее в сыром виде, если вы не сохранили ее в странном формате) и вуаля - у вас есть дата создания! Например, мой сценарий для обновления моего файла журнала каждые 30 дней выглядит так:

if (file_exists($logfile)) {
            $now = new DateTime();
            $date_created = fgets(fopen($logfile, 'r'));
            if ($date_created == '') {
                file_put_contents($logfile, date('Y-m-d H:i:s').PHP_EOL, FILE_APPEND | LOCK_EX);
            }
            $date_created = new DateTime($date_created);
            $expiry = $date_created->modify('+ 30 days');
            if ($now >= $expiry) {
                unlink($logfile);
            }
        }
SDukla
источник
5
Почему вам нужно изменить или даже удалить файл, чтобы получить дату? Это не похоже на решение исходной проблемы
Нико Хаасе