- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用 FreeNAS CIFS 与 Windows 共享(同步文件从 Windows 到 FreeNAS)并遇到 robocopy.exe 认为某些文件需要同步的问题每次运行 robocopy.exe (/COPY:DAT) 时都会再次复制。
我最喜欢的文件管理工具Far Manager告诉我“更改时间”不一样:
Windows 上的文件时间:
FreeNAS (ZFS) 支持的 CIFS 共享上的文件时间:
我对“更改时间”丢失这一事实非常满意,我很乐意在 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/
我是一名优秀的程序员,十分优秀!