如何从Python更改Windows文件的文件创建日期?
答案 0 :(得分:32)
Yak shaving获胜。
import pywintypes, win32file, win32con
def changeFileCreationTime(fname, newtime):
wintime = pywintypes.Time(newtime)
winfile = win32file.CreateFile(
fname, win32con.GENERIC_WRITE,
win32con.FILE_SHARE_READ | win32con.FILE_SHARE_WRITE | win32con.FILE_SHARE_DELETE,
None, win32con.OPEN_EXISTING,
win32con.FILE_ATTRIBUTE_NORMAL, None)
win32file.SetFileTime(winfile, wintime, None, None)
winfile.close()
答案 1 :(得分:3)
首先安装pywin32扩展程序 https://sourceforge.net/projects/pywin32/files/pywin32/Build%20221/
import win32file
import pywintypes
# main logic function
def changeFileCreateTime(path, ctime):
# path: your file path
# ctime: Unix timestamp
# open file and get the handle of file
# API: http://timgolden.me.uk/pywin32-docs/win32file__CreateFile_meth.html
handle = win32file.CreateFile(
path, # file path
win32file.GENERIC_WRITE, # must opened with GENERIC_WRITE access
0,
None,
win32file.OPEN_EXISTING,
0,
0
)
# create a PyTime object
# API: http://timgolden.me.uk/pywin32-docs/pywintypes__Time_meth.html
PyTime = pywintypes.Time(ctime)
# reset the create time of file
# API: http://timgolden.me.uk/pywin32-docs/win32file__SetFileTime_meth.html
win32file.SetFileTime(
handle,
PyTime
)
# example
changeFileCreateTime('C:/Users/percy/Desktop/1.txt',1234567789)
答案 2 :(得分:2)
此代码适用于没有的python 3
ValueError: astimezone() cannot be applied to a naive datetime
:
wintime = datetime.datetime.utcfromtimestamp(newtime).replace(tzinfo=datetime.timezone.utc)
winfile = win32file.CreateFile(
fname, win32con.GENERIC_WRITE,
win32con.FILE_SHARE_READ | win32con.FILE_SHARE_WRITE | win32con.FILE_SHARE_DELETE,
None, win32con.OPEN_EXISTING,
win32con.FILE_ATTRIBUTE_NORMAL, None)
win32file.SetFileTime(winfile, wintime)
winfile.close()
答案 3 :(得分:1)
import os
os.utime(path, (accessed_time, modified_time))
答案 4 :(得分:1)
这是一个适用于Python 3.5和Windows 7的解决方案。非常简单。我承认这是一个草率的编码......但它确实有效。欢迎你来清理它。我只需要一个快速的解决方案。
import pywintypes, win32file, win32con, datetime, pytz
def changeFileCreationTime(fname, newtime):
wintime = pywintypes.Time(newtime)
winfile = win32file.CreateFile(fname, win32con.GENERIC_WRITE,
win32con.FILE_SHARE_READ |
win32con.FILE_SHARE_WRITE |
win32con.FILE_SHARE_DELETE,
None,
win32con.OPEN_EXISTING,
win32con.FILE_ATTRIBUTE_NORMAL,
None)
win32file.SetFileTime( winfile, wintime, wintime, wintime)
# None doesnt change args = file, creation, last access, last write
# win32file.SetFileTime(None, None, None, None) # does nonething
winfile.close()
if __name__ == "__main__":
local_tz = pytz.timezone('Antarctica/South_Pole')
start_date = local_tz.localize(datetime.datetime(1776,7,4), is_dst=None)
changeFileCreationTime(r'C:\homemade.pr0n', start_date )
答案 5 :(得分:1)
我不想只使用整个pywin32
/ win32file
库来设置文件的创建时间,所以我制作了win32-setctime
软件包来做到这一点。
pip install win32-setctime
然后像这样使用它:
from win32_setctime import setctime
setctime("my_file.txt", 1561675987.509)
基本上,该函数可以减少到只有几行,而不需要内置ctypes
Python库以外的任何依赖项:
from ctypes import windll, wintypes, byref
filepath = "my_file.txt"
epoch = 1561675987.509
timestamp = int((epoch * 10000000) + 116444736000000000)
ctime = wintypes.FILETIME(timestamp & 0xFFFFFFFF, timestamp >> 32)
handle = windll.kernel32.CreateFileW(filepath, 256, 0, None, 3, 128, None)
windll.kernel32.SetFileTime(handle, byref(ctime), None, None)
windll.kernel32.CloseHandle(handle)
有关高级管理(例如错误处理),请参见the source code of win32_setctime.py
。
答案 6 :(得分:0)
这是接受答案的更强大版本。它还具有相反的吸气功能。这解决了创建,修改和访问日期时间的问题。它处理日期时间参数作为datetime.datetime对象提供,或者作为“自纪元以来的秒数”(getter返回的内容)。此外,它调整了日间节能时间,接受的答案没有。如果没有这个,当您在实际系统时间的反向阶段设置冬季或夏季时,将无法正确设置时间。
这个答案的主要缺点是它仅适用于Windows(它回答了提出的问题)。将来,我会尝试发布跨平台解决方案。
def isWindows() :
import platform
return platform.system() == 'Windows'
def getFileDateTimes( filePath ):
return ( os.path.getctime( filePath ),
os.path.getmtime( filePath ),
os.path.getatime( filePath ) )
def setFileDateTimes( filePath, datetimes ):
try :
import datetime
import time
if isWindows() :
import win32file, win32con
ctime = datetimes[0]
mtime = datetimes[1]
atime = datetimes[2]
# handle datetime.datetime parameters
if isinstance( ctime, datetime.datetime ) :
ctime = time.mktime( ctime.timetuple() )
if isinstance( mtime, datetime.datetime ) :
mtime = time.mktime( mtime.timetuple() )
if isinstance( atime, datetime.datetime ) :
atime = time.mktime( atime.timetuple() )
# adjust for day light savings
now = time.localtime()
ctime += 3600 * (now.tm_isdst - time.localtime(ctime).tm_isdst)
mtime += 3600 * (now.tm_isdst - time.localtime(mtime).tm_isdst)
atime += 3600 * (now.tm_isdst - time.localtime(atime).tm_isdst)
# change time stamps
winfile = win32file.CreateFile(
filePath, win32con.GENERIC_WRITE,
win32con.FILE_SHARE_READ | win32con.FILE_SHARE_WRITE | win32con.FILE_SHARE_DELETE,
None, win32con.OPEN_EXISTING,
win32con.FILE_ATTRIBUTE_NORMAL, None)
win32file.SetFileTime( winfile, ctime, atime, mtime )
winfile.close()
else : """MUST FIGURE OUT..."""
except : pass