2010-08-04 91 views
4

我在Windows XP上测试了这个。NTFS文件系统时间

如果我做

  1. 创建一个文件。
  2. 写入文件。
  3. 关闭文件。(然后,该文件的LastWriteTime改变)

但如果我这样做

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

编辑

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()); 

你能解释我这件事吗? 谢谢。

回答

1

答曰documentation

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

[...]

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

+0

它通过使用本机WinAPI而不是.NET进行测试。 没有缓存。 – Benjamin 2010-08-04 04:06:28

+0

“没有缓存。”对于没有发布代码的人来说,这是一个非常大胆的断言,具有他无法解释的神秘行为,并且正在使用具有斑点行为文档的文件系统:http://msdn.microsoft.com/en-us/library /ms724290%28v=VS.85%29.aspx – msw 2010-08-04 06:20:37

+1

对于我粗鲁的评论,我很抱歉。我不是故意的。我的英语说得不好。我编辑了我的问题。感谢msw。 – Benjamin 2010-08-04 07:22:50

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函数,这可能会导致不必要的 性能损失。一起使用这些标记可以避免这些处罚。 有关 缓存文件和元数据的一般信息,请参阅 文件缓存。

相关问题