Windows os.stat and os.fstat report different st_ctime_ns values
還沒有人認領這個 Issue。
- 主要語言
- Python
- 星號
- 77.2k
- 分支
- 35.9k
- PR 合併指標
- PR 指標待擷取
描述
Bug description:
On Windows, os.stat(path).st_ctime_ns and os.fstat(fd).st_ctime_ns can differ for the same file.
I ran the example below on Windows 11 with NTFS. It fails with both official Python 3.14.7 Windows builds: ARM64 running natively and x64 running under emulation. The same-file assertion passes, but the timestamp assertion fails. Both st_birthtime_ns values equal os.stat(path).st_ctime_ns.
In the 3.14.7 code:
_Py_attribute_data_to_statassignsFILE_BASIC_INFO.ChangeTimetost_ctime._Py_fstat_noraisereturns that result.os_fstat_impldoes not change the timestamp.win32_xstatreplacesst_ctimeand its nanoseconds withst_birthtimefor compatibility.
Commit a01fb672 added that compatibility step. The discussion in #102149 says st_ctime should continue returning creation time during the deprecation period. Should fstat() do the same?
In #117354, DirEntry.stat() was changed to return creation time during the same deprecation period, following #117267.
Example:
import os
import time
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as directory:
path = Path(directory) / "example.txt"
path.write_text("before")
time.sleep(0.1)
path.write_text("after")
with path.open("rb") as source:
by_path = os.stat(path)
by_fd = os.fstat(source.fileno())
print("stat ctime:", by_path.st_ctime_ns)
print("fstat ctime:", by_fd.st_ctime_ns)
print("stat birthtime:", getattr(by_path, "st_birthtime_ns", None))
print("fstat birthtime:", getattr(by_fd, "st_birthtime_ns", None))
assert os.path.samestat(by_path, by_fd)
assert by_path.st_ctime_ns == by_fd.st_ctime_ns
Output from the official Python 3.14.7 ARM64 build:
stat ctime: 1789643317486473600
fstat ctime: 1789643317591142500
stat birthtime: 1789643317486473600
fstat birthtime: 1789643317486473600
The final assertion raises AssertionError.
CPython versions tested on:
- 3.10.20 (conda-forge build): timestamps match.
- 3.14.6 (Anaconda build): timestamps differ.
- 3.14.7: timestamps differ with both official Windows embeddable builds, ARM64 and x64.
Operating systems tested on:
Windows 11 ARM64, build 26200.9457, in Parallels Desktop. The test files were on NTFS. The ARM64 Python build ran natively and the x64 build ran under Windows emulation.
貢獻指南
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
研究方向
從 Python/fileutils.c 中的 _Py_attribute_data_to_stat 和 _Py_fstat_noraise 開始,接著檢查 Modules/posixmodule.c 中的 os_fstat_impl 和 win32_xstat。在 Windows 上執行提供的重現,並驗證 os.stat() 和 os.fstat() 回報的 ctime_ns 值一致,同時保留所示的建立時間行為。
由索引模型根據 Issue 內容生成。
評估
- 技術堆疊
- python
- 領域
- operating-systems
- Issue 類型
- 缺陷
- 難度
- 3/5
- 預估耗時
- 1-2 天
- 活躍度
- 活躍
- 描述清晰度
- 基本清楚
- 新手友好度
- 72/100