#python #posix #stat
#python #posix #статистика
Вопрос:
Я пытаюсь использовать следующий код:
os.stat(path_name)[stat.ST_CTIME] = ctime
Однако это приводит к следующей ошибке:
exceptions.TypeError: 'posix.stat_result' object does not support item assignment
Есть ли способ изменить ctime?
Спасибо!
Комментарии:
1. Измените системное время, создайте новую жесткую ссылку на файл и переименуйте его. Измените системное время обратно.
2. Вы бы модифицировали копию значений, полученных вами из ОС, а не то, что на самом деле использует ОС.
Ответ №1:
os.utime(filename, timetuple)
может использоваться для установки atime и mtime файла. Насколько я знаю, нет способа изменить ctime из пользовательского пространства, не прибегая к хакерским способам, таким как игра с часами или прямое редактирование файловой системы (что я действительно не рекомендую), и это верно для любого языка программирования (Python, Perl, C, C …): это внутреннее содержимое ОС, и вы не хотите его трогать.
Смотрите, например, в документации touch
команды (http://www.delorie.com/gnu/docs/fileutils/fileutils_54.html ):
Хотя touch предоставляет опции для изменения двух значений времени — времени последнего доступа и модификации — файла, на самом деле существует и третье: время изменения индекса. Это часто называют ctime файла. Время изменения индекса представляет время последнего изменения метаинформации файла. Одним из распространенных примеров этого является изменение разрешений файла. Изменение разрешений не приводит к доступу к файлу, поэтому atime не изменяется, и оно не изменяет файл, поэтому mtime не меняется. Тем не менее, что-то в самом файле изменилось, и это должно быть где-то отмечено. Это задание поля ctime. Это необходимо, чтобы, например, программа резервного копирования могла создать новую копию файла, включая новое значение разрешений. Другой операцией, которая изменяет ctime файла, не затрагивая другие, является переименование. В любом случае, при обычных операциях пользователь не может изменить поле ctime на указанное пользователем значение.
Ответ №2:
GNU stroke реализует трюк с изменением системного времени для изменения ctime файла. Если это то, что вы хотите, GNU stroke сделает это за вас: http://stroke.sourceforge.net /.
Ответ №3:
Нет прямого способа установить время изменения, оно обновляется всякий раз, когда изменяется информация об индексе, такая как владелец, количество ссылок, режим и т.д..
Попробуйте установить режим в уже установленный режим:
os.chmod(path_name, os.stat(path_name)[stat.ST_MODE])
Комментарии:
1. ctime — это время создания, а не «время изменения». Вы можете установить mtime (и atime) произвольно, а не ctime.
2. @Wooble: из man fstat «time_t st_ctime; /* время последнего изменения статуса * /»
3. @Wooble: ctime: время последнего изменения статуса [ en.wikipedia.org/wiki/Stat_ (Unix)]
Ответ №4:
Столкнулся с этим недавно, вот как я закончил это делать:
def _update_ctime(filename, cdatetime):
args = [
'sudo',
'touch',
'-d', str(cdatetime)[:19],
filename,
]
proc = subprocess.run(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
if proc.returncode != 0: print('=> Error changing time on file {}'.format(cdatetime))
Не защищен от ошибок (в зависимости от локали и т.д., Но может быть улучшен…