Изменено время после копирования файла

В perl 5, используя stat для файла, который был только что скопирован из старого файла, кажется, что mtime — это время, когда старый файл был первоначально создан, а не скопирован.

Как получить время копирования? ctime кажется самым близким, однако в документации есть предупреждения о совместимости между ОС.

Как это получилось? Напоминаем, см. Что мне делать, когда кто-то отвечает на мой вопрос?

zdim 02.03.2019 09:39

Извините, но ни один из полученных мной ответов (включая ваш) не был достаточно ясен для использования. Поведение в разных ОС разное, документация неясна — кажется, что каждая ОС имеет свое собственное, непоследовательное определение трех временных меток. Также см. мой последний комментарий к нижнему ответу.

gil_mo 03.03.2019 10:07

Ладно. Спасибо за ответ. Это как раз то, что происходит с временными метками. Если вам действительно нужен портативный способ отслеживания времени копирования, вам придется написать гораздо больше кода, чем вызывать флаг/встроенный.

zdim 03.03.2019 21:37
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
729
2

Ответы 2

Простой ответ: вы не можете в большинстве случаев.

ctime — это нет время создания файла. Цитата из man 7 inode в системе Linux:

Last status change timestamp (ctime) stat.st_ctime; statx.stx_ctime

This 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 the stat structure); statx.stx_btime

The file's creation timestamp. This is set on file creation and not changed subsequently.

The btime timestamp was not historically present on UNIX systems and is not currently supported by most Linux filesystems.

Я не предполагал, что ctime - это время создания, я искал решение. Подскажите пожалуйста, что я может делаю, а не чего не умею :)

gil_mo 28.01.2019 12:55

Я предполагаю, что под «временем копирования» вы имеете в виду «когда была создана копия». Это будет btime, который не является переносимым. Если вы используете процесс копирования, который не сохраняет штампы файлов, т.е. cp --no-preserve=timestamps, тогда вы можете использовать ctime как «время создания файла».

Stefan Becker 28.01.2019 12:58

Время 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

Dave Mitchell 28.01.2019 14:09

Только что попробовал: в Проводнике Windows создал файл, сделал его копию, запустил: my @statA = stat "C:\\tempcopy.txt"; напечатать "$statA[8]\n"; напечатать "$statA[9]\n"; И получил: 1548699422 1539269413

gil_mo 28.01.2019 19:20

Есть несколько неуказанных деталей, но кажется, что временная метка 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 сейчас.

Другие вопросы по теме