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

Windows磁盘分区最后修改时间获取问题(Python tkinter应用)

解决方案:捕获Windows磁盘分区的全量变更时间

针对你的需求,推荐两个适用于NTFS分区的高效方案,均能在数秒内返回包含文件删除操作在内的分区最新变更时间:

方案一:读取NTFS主文件表($MFT)的修改时间

NTFS的主文件表($MFT)记录了分区内所有文件的元数据,任何增删改文件/文件夹的操作都会直接修改$MFT,因此它的LastWriteTime就是分区的最新变更时间。

代码实现

import os
import datetime

def get_volume_last_modified(volume_drive):
    # 构造$MFT的路径,如"\\\\.\\C:\\$MFT"
    mft_path = f"\\\\.\\{volume_drive}:\\$MFT"
    try:
        # 获取$MFT的文件状态,需管理员权限
        stat_result = os.stat(mft_path)
        # 转换为本地时间
        return datetime.datetime.fromtimestamp(stat_result.st_mtime)
    except PermissionError:
        raise PermissionError("需要管理员权限访问$MFT,请以管理员身份运行程序")
    except FileNotFoundError:
        raise NotImplementedError("仅支持NTFS分区,当前分区不支持该方法")

# 使用示例
print(get_volume_last_modified("C"))

注意事项

  • 仅支持NTFS分区,FAT32等文件系统无$MFT
  • 必须以管理员身份运行程序才能访问$MFT(系统隐藏文件)
  • 无需遍历分区,读取速度极快,耗时在毫秒级

方案二:读取USN Journal(更新序列号日志)

Windows的USN Journal会记录NTFS卷上所有文件系统操作的详细日志(包括删除、重命名等),通过查询日志的最新记录时间,可直接获取分区的最新变更时间。

代码实现(依赖pywin32库)

首先安装依赖:

pip install pywin32

然后编写代码:

import win32file
import win32api
import win32con
import datetime

def get_usn_journal_last_change(volume_drive):
    volume_path = f"\\\\.\\{volume_drive}:"
    # 打开卷设备
    h_volume = win32file.CreateFile(
        volume_path,
        win32con.GENERIC_READ,
        win32con.FILE_SHARE_READ | win32con.FILE_SHARE_WRITE,
        None,
        win32con.OPEN_EXISTING,
        0,
        None
    )
    
    try:
        # 查询USN Journal信息
        buffer = win32file.DeviceIoControl(
            h_volume,
            win32con.FSCTL_QUERY_USN_JOURNAL,
            None,
            1024
        )
        
        # 解析USN_JOURNAL_DATA_V0结构体中的LastUsnTime(偏移量80-87字节)
        file_time = buffer[80:88]
        sys_time = win32api.FileTimeToSystemTime(file_time)
        # 转换为datetime对象
        return datetime.datetime(
            sys_time.wYear, sys_time.wMonth, sys_time.wDay,
            sys_time.wHour, sys_time.wMinute, sys_time.wSecond
        )
    except win32api.error as e:
        if e.winerror == 1237:
            raise NotImplementedError("当前分区未启用USN Journal,可通过fsutil命令启用")
        else:
            raise
    finally:
        win32file.CloseHandle(h_volume)

# 使用示例
print(get_usn_journal_last_change("C"))

注意事项

  • 仅支持NTFS分区
  • 需要管理员权限
  • 若USN Journal未启用,可通过管理员PowerShell执行以下命令启用(以C盘为例):
    fsutil usn createjournal m=1048576 a=1048576 C:
    
  • 读取日志元数据速度极快,耗时在毫秒级

方案对比

方案优点缺点
$MFT时间代码实现简单,无需额外依赖仅能获取最后变更时间,无法区分具体操作类型
USN Journal可获取详细操作日志(若需要)需依赖pywin32,部分系统可能未启用日志

内容的提问来源于stack exchange,提问作者Muhammad Aatif

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 04:01:08