Время файловой системы NTFS - PullRequest
4 голосов
/ 04 августа 2010

Я проверил это на Windows XP.

Если я сделаю

  1. Создать файл.
  2. Записать в файл.
  3. Закрытьфайл. (Затем, LastWriteTime файла изменяется)

Но если я сделаю

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

Редактировать :

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 ]

3 голосов
/ 04 августа 2010

Попробуйте позвонить 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 голос
/ 04 августа 2010

Документация :

Значение LastWriteTime свойство предварительно кэшируется, если текущий экземпляр объекта FileSystemInfo был возвращен из любого из следующих Методы DirectoryInfo:

[...]

Чтобы получить последнее значение, позвоните Обновить метод.

...