如何在Windows中获取* change *文件时间?

问题描述 投票:4回答:2

我正在尝试在Windows上使用FreeNAS CIFS共享(将文件来自 Windows FreeNAS同步),并遇到一个问题,即robocopy.exe认为每次我运行robocopy时都需要再次复制一些文件.exe(/ COPY:DAT)。

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

Windows上的文件时间:“在Windows中”

由FreeNAS(ZFS)支持的CIFS共享上的文件时间:“在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,可以操纵它的外部命令行工具等)。

python winapi filesystems ntfs
2个回答
4
投票

[好,我似乎已经弄明白了,这要感谢cocarin指出了Far来源。Far使用NtQueryInformationFile来获取时间,并使用NtSetInformationFile来设置时间,而FILE_BASIC_INFORMATION结构包含所有4次,包括更改时间。

QueryInformationFile文档: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的包装器,但这已经足够了,我可以编写自己的包装器。


0
投票

没有比接受的答案更好的方法,而不必求助于Windows Vista及更高版本(Server 2008及更高版本)上的本机系统Zw*调用。

请看下面的示例代码:

// Get a handle to the file whose change time you want
HANDLE hFile=::CreateFile(...;

if (hFile!=INVALID_HANDLE_VALUE)
{
  FILE_BASIC_INFO fileBasicInfo={};

  if (::GetFileInformationByHandleEx(
        hFile,
        FileBasicInfo,          // Info class from FILE_INFO_BY_HANDLE_CLASS enum
        &fileBasicInfo,         // Where to store the info
        sizeof(fileBasicInfo))  // Buffer size
  {
      // Use fileBasicInfo.ChangeTime for the file change time
      ...
  }

  ::CloseHandle(hFile);
}

为方便起见,这里是相应的MSDN条目链接:

注意:另外,请查看此treasure trove函数所具有的其他信息类,这些信息类可满足您所有高级文件信息的需求。例如,FileStandardInfo类为您提供了一些有用的提示,例如,实际分配给文件的空间量(例如,用于稀疏文件的实际物理空间使用),链接数,正在删除的目录,是目录,等等...

© www.soinside.com 2019 - 2024. All rights reserved.