python - 如何在 Windows 中获取 *更改* 文件时间?

标签 python winapi filesystems ntfs

我正在尝试使用 FreeNAS CIFS 与 Windows 共享(同步文件 Windows FreeNAS)并遇到 robocopy.exe 认为某些文件需要同步的问题每次运行 robocopy.exe (/COPY:DAT) 时都会再次复制。

我最喜欢的文件管理工具Far Manager告诉我“更改时间”不一样:

Windows 上的文件时间: On Windows

FreeNAS (ZFS) 支持的 CIFS 共享上的文件时间: On CIFS share backed by FreeNAS (ZFS)

我对“更改时间”丢失这一事实非常满意,我很乐意在 Windows 驱动器上重置更改时间,但我找不到如何以编程方式执行此操作。

Python 的 os.stat(filename) 返回 st_atime、st_mtime 和 st_ctime,而且,我测试过,这个元组在 Windows 和 FreeNAS 之间具有相等的值。大概不存在“更改时间”。

Windows API 也只给出 3 个数字(创建、上次访问和上次写入)但没有“更改时间”: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724320(v=vs.85).aspx

显然,robocopy.exe 和 Far Manager 都以某种方式从系统中获取了 4 个值。我真的很想避免拆卸它们,希望能在这里得到答案。如何获取和设置“更改时间”?

任何解决方案都可以(Python、C++、WinAPI、可以操纵它的外部命令行工具等)。

最佳答案

好的,我似乎已经弄清楚了,感谢 cocarin 指向远源。 Far 使用 NtQueryInformationFile 获取时间,使用 NtSetInformationFile 设置时间,FILE_BASIC_INFORMATION 结构包含所有 4 个时间,包括更改时间。

查询信息文件文档:http://msdn.microsoft.com/en-us/library/windows/hardware/ff567052(v=vs.85).aspx (ZwQueryInformationFile)

SetInformationFile 文档:http://msdn.microsoft.com/en-us/library/windows/hardware/ff567096(v=vs.85).aspx (ZwSetInformationFile)

FILE_BASIC_INFORMATION 文档:http://msdn.microsoft.com/en-us/library/windows/hardware/ff545762(v=vs.85).aspx

typedef struct _FILE_BASIC_INFORMATION {
  LARGE_INTEGER CreationTime;
  LARGE_INTEGER LastAccessTime;
  LARGE_INTEGER LastWriteTime;
  LARGE_INTEGER ChangeTime;        // <--- win!
  ULONG         FileAttributes;
} FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;

不确定是否有适合 Python 的包装器,但这已经足够了,我可以编写自己的包装器。

关于python - 如何在 Windows 中获取 *更改* 文件时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27534448/

相关文章:

Python:无法建立连接,因为目标机器主动拒绝它

C++ Wifi 信号强度

winapi - 如何在 TCM_SETCURSEL 消息后更新选项卡的内容

c++ - 如何为类定义 UUID,并以与 g++ 和 Visual C++ 相同的方式使用 __uuidof?

php - 测试一个目录是否是另一个文件夹的子目录

Python abstract property() "Can' t 用抽象方法实例化抽象类 []”,但我做到了

python - 使用 gunicorn 时如何设置 django 测试服务器?

python - 异构 numpy 数组上的数组操作

shell - 是否可以在 btrfs 文件系统上获取文件的压缩和未压缩大小?

php - PHP 5.6 中的 require() 函数是否缓存其结果?