Дата изменения Изменено для файла после записи в Python - PullRequest
0 голосов
/ 04 июля 2018

У меня странная проблема с python, когда я пытаюсь изменить значение поля «Дата изменения» в Windows. В частности, если я пишу в файл, а затем пытаюсь изменить его атрибут Date Modified, изменение завершается неудачно (Date Modified становится временем, когда я запускал скрипт python). Однако, если я не записываю в файл (если я закомментирую вызов функции out.write), время модификации даты будет правильно установлено на 11 / 2017.

Время доступа к дате установлено в обеих ситуациях, как и ожидалось.

Ниже мой код (python 2.7):

import os
import time
import datetime

out = open("out.test", "wb")
#comment out the write line to get this to work
out.write("hi")
out.flush()
out.close

fileLocation = "out.test"
year = 2017
month = 11
day = 5
hour = 19
minute = 50
second = 0

date = datetime.datetime(year=year, month=month, day=day, hour=hour, minute=minute, second=second)
modTime = time.mktime(date.timetuple())

os.utime(fileLocation, (modTime, modTime))

Интересно, что если я использую отдельный процесс python (то есть запускаю python в другом приглашении cmd) для изменения даты изменения, это также работает.

Есть ли какая-то другая функция, похожая на сброс, которую мне нужно вызвать, чтобы правильно установить время изменения даты, если я запишу в файл?

Заранее спасибо.

1 Ответ

0 голосов
/ 04 июля 2018

Проблема заключается в этой ошибочной строке:

out.close

this не закрывает файл (ничего полезного не делает, просто читает ссылку на функцию и не вызывает ее). Обычно это не имеет большого значения, потому что python закрывает файлы при выходе, но не здесь.

Когда процесс завершается / дескриптор файла собирается сборщиком мусора, в файл вызывается неявное close, которое устанавливает дату изменения в текущее время.

То есть utime изменяет время, когда файл открыт, но впоследствии файл закрывается, а время изменения сбрасывается: похоже, это не имеет никакого эффекта.

(похожая проблема была задана и дана здесь ответ: система против вызова против попона в Python )

Исправление, конечно:

out.close()

Обратите внимание, что есть небольшая разница при записи в файл или нет. Если вы не записываете в файл, неявный вызов close, вероятно, не должен обновлять время файла, что объясняет его работу.

Последний совет: используйте менеджеры контекста, чтобы избежать подобных проблем. Вам не нужно будет звонить close так часто:

with open("out.test", "w") as out:
    out.write("hi")
    out.flush()

# file is closed when exiting "with" block
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...