NTFS文件系统时间

时间:2010-08-04 02:29:38

标签: windows filesystems ntfs

我在windows xp上测试了这个。

如果我这样做

  1. 创建文件。
  2. 写入文件。
  3. 关闭文件。(然后,文件的LastWriteTime已更改)
  4. 但如果我这样做

    1. 创建文件。
    2. 设置文件的LastFileTime。
    3. 通过调用GetFileTime检查时间(然后,更改文件的LastWriteTime)
    4. 睡20秒。
    5. 写入文件。
    6. 睡20秒。
    7. 关闭文件。
    8. 通过调用GetFileTime来检查时间(进程5的时间永远不会被应用。为什么?)
    9. 修改

      wstring fileName = L"D:\\testfile.txt";
      HANDLE h = CreateFileW(fileName.c_str(), GENERIC_WRITE | GENERIC_READ, 
                          FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
                          0,
                          CREATE_ALWAYS,
                          0, 0);
      
      FILETIME ft1, ft2, ft3;
      if(!GetFileTime(h, &ft1, &ft2, &ft3))
      {
          return;
      }
      std::cout << ft3.dwHighDateTime << std::endl << ft3.dwLowDateTime << std::endl;
      ft1.dwLowDateTime = 1000000;
      
      if(!SetFileTime(h, &ft1, &ft1, &ft1))
      {
          return;
      }
      
      if(!GetFileTime(h, &ft1, &ft2, &ft3))
      {
          return;
      }
      std::cout << ft3.dwHighDateTime << std::endl << ft3.dwLowDateTime << std::endl;
      
      Sleep(5000);
      TCHAR buffer[] = L"Test1234567890 Test1234567890 Test1234567890 Test1234567890 Test1234567890\r\n";
      DWORD writeBytes = 0;
      BOOL fOk = WriteFile(h, buffer, sizeof(buffer), &writeBytes, 0);
      if(!fOk)
      {
          return;
      }
      if(writeBytes != sizeof(buffer))
      {
          return;
      }
      
      if(!GetFileTime(h, &ft1, &ft2, &ft3))
      {
          return;
      }
      std::cout << ft3.dwHighDateTime << std::endl << ft3.dwLowDateTime << std::endl;
      
      CloseHandle(h);
      
      h = CreateFileW(fileName.c_str(), GENERIC_WRITE | GENERIC_READ, 
          FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
          0,
          OPEN_EXISTING,
          0, 0);
      if(!GetFileTime(h, &ft1, &ft2, &ft3))
      {
          return;
      }
      std::cout << ft3.dwHighDateTime << std::endl << ft3.dwLowDateTime << std::endl;
      
      CloseHandle(h);
      DeleteFile(fileName.c_str());
      
      你能解释一下这个吗? 感谢。

2 个答案:

答案 0 :(得分:3)

尝试在更改时间戳后调用FlushFileBuffers(h)或在打开文件时使用FILE_FLAG_WRITE_THROUGHFILE_FLAG_NO_BUFFERING标志。请参阅http://msdn.microsoft.com/en-us/library/aa363858.aspx#caching_behavior

  

通过直写请求   FILE_FLAG_WRITE_THROUGH也会导致   NTFS刷新任何元数据更改,   例如时间戳更新或   重命名操作,结果来自   处理请求。为了这   原因,FILE_FLAG_WRITE_THROUGH   标志经常用于   FILE_FLAG_NO_BUFFERING标志为   更换呼叫   每个后都有FlushFileBuffers函数   写,这可能会导致不必要的   绩效惩罚。使用这些   旗帜一起避免了这些处罚。   有关的一般信息   缓存文件和元数据,请参阅   文件缓存。

答案 1 :(得分:1)

documentation

  

LastWriteTime的值   如果当前属性是预先缓存的   FileSystemInfo对象的实例   从以下任何一项返回   DirectoryInfo方法:

     

[...]

     

要获取最新值,请致电   刷新方法。