我在windows xp上测试了这个。
如果我这样做
但如果我这样做
修改:
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());
你能解释一下这个吗?
感谢。
答案 0 :(得分:3)
尝试在更改时间戳后调用FlushFileBuffers(h)
或在打开文件时使用FILE_FLAG_WRITE_THROUGH
和FILE_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)
LastWriteTime的值 如果当前属性是预先缓存的 FileSystemInfo对象的实例 从以下任何一项返回 DirectoryInfo方法:
[...]
要获取最新值,请致电 刷新方法。