創用 CC 授權條款
除非另有註明,本網站的著作Fygul Hether製作,以創用CC 姓名標示-非商業性-禁止改作 4.0 國際 授權條款釋出。

2017年11月20日 星期一

以Python修改檔案的建立日期與時間

Python zipfile模組之二〉提到如何修改檔案的修改與存取時間,本文則展示在Windows下如何以Python修改檔案的建立時間。

這裡要先說明的是,各種作業系統與檔案系統的設計有所不同(如POSIX標準的定義中並無建立時間),這個檔案建立日期時間是Windows中才有的,所以以下的範例代碼僅用在Windows平台。Python也要先裝好pywin32 (Python extensions for Windows)才行。

另外一個提醒:有一些免費的Windows軟體已提供了修改檔案建立/修改/存取日期時間的功能,像BulkFileChanger。如果不是特別複雜的情況,通常這類工具就夠用了,不必自己寫。

以下的例子是修改一test.txt檔案的建立時間,直接放範例代碼與說明。Python需透過pywin32使用Windows API來達成這個工作,範例代碼如下:

import datetime
from win32file import CreateFile, SetFileTime, CloseHandle, GENERIC_WRITE, OPEN_EXISTING

filename = 'test.txt'
now = datetime.datetime.now()
print('以下將設定{}的檔案建立時間為現在的時間:{}'.format(filename, now.strftime('%Y-%m-%d %H:%M:%S')))

CreationTime = datetime.datetime.utcfromtimestamp(now.timestamp()).replace(tzinfo=datetime.timezone.utc)
print(CreationTime)

Handle = CreateFile(filename, GENERIC_WRITE, 0, None, OPEN_EXISTING, 0, 0)
try:
    SetFileTime(Handle, CreationTime, None, None)
finally:
    CloseHandle(Handle)
傳給SetFileTime()的時間必須帶有時區資訊,否則會出現以下錯誤:
ValueError: astimezone() cannot be applied to a naive datetime
print(CreationTime)可觀察到這個時間是帶有時區資訊的。

SetFileTime()也可以設定檔案的修改/存取時間,這裡沒用到故設為None。

詳細的用法可看一下pywin32的說明文件。裝好pywin32後,它有提供一個說明檔在python的子目錄下:Lib\site-packages\PyWin32.chm

參考

  • https://stackoverflow.com/a/36494602

沒有留言:

張貼留言