How do I change the file creation date of a Windows file from Python?
如何从python更改Windows文件的文件创建日期?
为胜利剃牦牛皮。
1 2 3 4 5 6 7 8 9 10 11 12 | 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() |
install pywin32 extension first https://sourceforge.net/projects/pywin32/files/pywin32/Build%20221/
号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | 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) |
此代码在没有
1 2 3 4 5 6 7 8 | 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() |
下面是一个在Python3.5和Windows7上工作的解决方案。很容易。我承认这是草率的编码…但它起作用了。欢迎你清理一下。我只需要一个快速解决。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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 ) |
。
1 2 | import os os.utime(path, (accessed_time, modified_time)) |
号
http://docs.python.org/library/os.html网站
下面是一个更为可靠的已接受答案。它还具有相反的吸气剂功能。此地址创建、修改和访问日期时间。它处理将datetime参数作为datetime.datetime对象或作为"自epoch以来的秒"(getter返回的值)提供。此外,它还针对日光节约时间进行调整,而接受的答案则没有。如果没有这一点,在实际系统时间的相反阶段设置冬季或夏季时间时,您的时间将无法正确设置。
这个答案的主要缺点是它只适用于Windows(它回答了所提出的问题)。将来,我将尝试发布一个跨平台的解决方案。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | 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 |
。