2010-08-04 3 views
4

Я тестировал это на окнах xp.Время файловой системы NTFS

Если я

  1. Создайте файл.
  2. Пишите к файлу.
  3. Закройте файл. (Затем LastWriteTime к файлу изменяется)

Но если я

  1. Создайте файл.
  2. Установить LastFileTime файла.
  3. Осмотрите время, вызвав GetFileTime (Затем изменилось значение LastWriteTime файла)
  4. Сон 20 секунд.
  5. Пишите к файлу.
  6. Сон 20 секунд.
  7. Закрыть файл.
  8. Осмотрите время, вызывая GetFileTime (время The process5 в никогда не применяется Почему.?)

Edit:

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

+0

«Нет кеша». это довольно смелое утверждение для тех, кто не опубликовал код, имеет таинственное поведение, которое он не может объяснить, и использует файловую систему, в которой есть документация по пятнистому поведению: http://msdn.microsoft.com/en-us/library /ms724290%28v=VS.85%29.aspx – msw

+1

Прошу прощения за мой грубый комментарий. Я не это имел в виду. Я не умею хорошо говорить по-английски. Я отредактировал мой вопрос. Спасибо msw. – Benjamin

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 после каждой записи, которые могут вызвать ненужную потери производительности. Использование этих флагов позволяет избежать этих штрафов. Для получения общей информации о кешировании файлов и метаданных см. Кэширование файлов.