Windows 11中Python新建同名文件继承旧创建日期的问题求助
问题描述
我有一个Python脚本,执行流程如下:
- 生成需保存至新文件的数据;
- 检查是否存在同名文件;
- 若存在则使用
os.rename重命名旧文件; - 将数据保存到新文件。
问题是新文件的“Date Created(创建日期)”与旧文件一致,显然Windows会“记忆”文件名+创建日期的组合,为同名新文件沿用该日期。运行以下示例代码多次后,所有生成的文件创建日期均相同,实际创建时间却不同:
from os import path, rename from datetime import datetime f_name = "file.txt" if path.exists(f_name) : file_mtime = path.getmtime(f_name) mt_stamp = datetime.fromtimestamp(file_mtime).strftime("%y%m%d-%H%M%S") file_name, file_extension = path.splitext(f_name) new_f_name = file_name + "-" + mt_stamp + file_extension rename(f_name, new_f_name) with open(f_name, 'w') as wfile: wfile.write("test text")
若不存在同名旧文件,新文件创建日期正常;若手动删除同名文件后运行脚本,新文件仍会沿用已删除文件的创建日期。请问如何强制让新文件拥有正确的自身创建日期?
解决方法
这是Windows NTFS文件系统的文件记录重用机制导致的——删除或重命名文件后,NTFS不会立即释放该文件的MFT(主文件表)记录,新创建的同名文件会复用这条记录,连带继承旧的创建日期。以下是两种可靠的解决方式:
方法1:创建临时文件再替换
先将内容写入与目标文件名不同的临时文件,再替换原目标文件。这样新文件会生成全新的MFT记录,不会继承旧日期:
from os import path, rename from datetime import datetime import uuid f_name = "file.txt" # 处理已存在的旧文件 if path.exists(f_name): file_mtime = path.getmtime(f_name) mt_stamp = datetime.fromtimestamp(file_mtime).strftime("%y%m%d-%H%M%S") file_name, file_extension = path.splitext(f_name) new_f_name = f"{file_name}-{mt_stamp}{file_extension}" rename(f_name, new_f_name) # 生成唯一临时文件名 temp_name = f"{f_name}.temp.{uuid.uuid4().hex}" # 写入临时文件 with open(temp_name, 'w') as wfile: wfile.write("test text") # 替换为目标文件 rename(temp_name, f_name)
方法2:调用Windows API修改创建时间
如果必须直接创建目标文件,可以通过pywin32库调用Windows API,强制设置新文件的创建时间为当前时间:
- 先安装依赖:
pip install pywin32
- 修改后的代码:
from os import path, rename from datetime import datetime import win32file import win32con f_name = "file.txt" if path.exists(f_name): file_mtime = path.getmtime(f_name) mt_stamp = datetime.fromtimestamp(file_mtime).strftime("%y%m%d-%H%M%S") file_name, file_extension = path.splitext(f_name) new_f_name = f"{file_name}-{mt_stamp}{file_extension}" rename(f_name, new_f_name) # 写入新文件 with open(f_name, 'w') as wfile: wfile.write("test text") # 获取当前时间的Windows FILETIME格式时间戳 now = datetime.now() file_time = win32file.TimeToFileTime(now) # 打开文件并设置创建时间 handle = win32file.CreateFile( f_name, win32con.GENERIC_WRITE, win32con.FILE_SHARE_READ | win32con.FILE_SHARE_WRITE, None, win32con.OPEN_EXISTING, win32con.FILE_ATTRIBUTE_NORMAL, None ) win32file.SetFileTime(handle, file_time, None, None) handle.close()
补充说明
- 方法1无需额外依赖,跨平台性更好,推荐优先使用;
- 方法2仅适用于Windows系统,需要安装第三方库,但可以直接操作目标文件的时间属性。
内容的提问来源于stack exchange,提问作者Scud Bee
相关产品推荐
相关产品推荐

