You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,强制设置新文件的创建时间为当前时间:

  1. 先安装依赖:
pip install pywin32
  1. 修改后的代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 20:12:44