В perl 5, используя stat для файла, который был только что скопирован из старого файла, кажется, что mtime — это время, когда старый файл был первоначально создан, а не скопирован.
Как получить время копирования? ctime кажется самым близким, однако в документации есть предупреждения о совместимости между ОС.
Извините, но ни один из полученных мной ответов (включая ваш) не был достаточно ясен для использования. Поведение в разных ОС разное, документация неясна — кажется, что каждая ОС имеет свое собственное, непоследовательное определение трех временных меток. Также см. мой последний комментарий к нижнему ответу.
Ладно. Спасибо за ответ. Это как раз то, что происходит с временными метками. Если вам действительно нужен портативный способ отслеживания времени копирования, вам придется написать гораздо больше кода, чем вызывать флаг/встроенный.





Простой ответ: вы не можете в большинстве случаев.
ctime — это нет время создания файла. Цитата из man 7 inode в системе Linux:
Last status change timestamp (
ctime)stat.st_ctime;statx.stx_ctimeThis is the file's last status change timestamp. It is changed by writing or by setting inode information (i.e., owner, group, link count, mode, etc.).
Пока не
Цитата из man 7 inode в системе Linux:
File creation (birth) timestamp (
btime) (not returned in thestatstructure);statx.stx_btimeThe file's creation timestamp. This is set on file creation and not changed subsequently.
The
btimetimestamp was not historically present on UNIX systems and is not currently supported by most Linux filesystems.
Я не предполагал, что ctime - это время создания, я искал решение. Подскажите пожалуйста, что я может делаю, а не чего не умею :)
Я предполагаю, что под «временем копирования» вы имеете в виду «когда была создана копия». Это будет btime, который не является переносимым. Если вы используете процесс копирования, который не сохраняет штампы файлов, т.е. cp --no-preserve=timestamps, тогда вы можете использовать ctime как «время создания файла».
Время mtime нового файла, только что скопированного из старого файла, будет временем копирования, если только какой-либо инструмент, используемый для копирования, не устанавливает время; например, $ perl -le'print скалярное локальное время( (stat "/etc/passwd")[9])' Вт, 11 декабря 20:33:24 2018 $ cp /etc/passwd /tmp $ perl -le'print скалярное локальное время( (stat "/tmp/passwd")[9])' Пн, 28 января, 13:07:29 2019
Только что попробовал: в Проводнике Windows создал файл, сделал его копию, запустил: my @statA = stat "C:\\tempcopy.txt"; напечатать "$statA[8]\n"; напечатать "$statA[9]\n"; И получил: 1548699422 1539269413
Есть несколько неуказанных деталей, но кажется, что временная метка ctime — лучший встроенный инструмент в вашем распоряжении. (Для Windows также см. модуль, указанный ниже.)
В Windows, согласно perlport (файлы и файловые системы), временная метка время изменения индекса
... may really be the "creation timestamp" (which it is not in Unix).
Это будет работать для вас напрямую, если файл создается путем копирования.
В Unix ctime отслеживает изменение индекса (наряду с изменениями метаданных), что кажется вам нужным. Эту метку времени также можно получить просто с помощью -Cоператор проверки файлов.
Если копирование может обновить содержимое существующего файла, я не понимаю, почему ctime не будет работать.
Обратите внимание на модуль Win32API::Файл::Время, с целью
provide maximal access to the file creation, modification, and access times under MSWin32
Пожалуйста, ознакомьтесь с некоторыми предостережениями в документах. Я не использовал его и не могу проверить на Windows сейчас.
Как это получилось? Напоминаем, см. Что мне делать, когда кто-то отвечает на мой вопрос?