Информация об изменениях

Сообщение Re[3]: только гипотеза от 09.09.2014 14:28

Изменено 09.09.2014 14:35 Pavel Dvorkin

Здравствуйте, Fortnum, Вы писали:

Проверил на чистом Win API, эффект есть как ты его описал.

F>Смущает то, что такая "неправильная" последовательность — в 100% случаев. Попробовал добавить аж 30-секундную задержку, до и после FileStream.Write() — не помогает. Добавил (мало ли) сразу после FileStream.Write — FileStream.Flush(true) — нет, время lastWriteTime все так же не меняется. А еще, если вместо времени в SetFileTime передать 0xFFFFFFFF, то и GetFileTime не потребуется — время, собственно, не меняется, но lastWriteTime перестает изменяться. В MSDN написано об этом, но только в отношении lastAccessTime.


Нет, в отношении lastWriteTime тоже

lpLastWriteTime [in, optional]
A pointer to a FILETIME structure that contains the new last modified date and time for the file or directory. This parameter can be NULL if the application does not need to change this information.
To prevent file operations using the given handle from modifying the last access time, call SetFileTime immediately after opening the file handle and pass a FILETIME structure whose dwLowDateTime and dwHighDateTime members are both set to 0xFFFFFFFF.

http://msdn.microsoft.com/ru-ru/library/windows/desktop/ms724933(v=vs.85).aspx


>Плюс есть еще пара неточностей в документации по SetFileTime: http://www.rsdn.ru/forum/dotnet/5773006
Автор: Fortnum
Дата: 07.09.14
В частности, написано, что такой эффект должен наблюдаться только при передаче 0xFFFFFFFF, а он по факту наблюдается при передаче любой метки времени.


Да. Странно.

Но вот если хоть чуть-чуть изменить время, то все начинает правильно работать


int main(int argc, _TCHAR* argv[])
{
        while (true)
        {
            HANDLE hFile = CreateFile("TestFile.txt", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, 0, 0);
            FILETIME ft;
            GetFileTime(hFile, 0, 0, &ft);
            printf("%u\n", ft.dwLowDateTime);
            FILETIME ft1 = { 0 };
            ft.dwLowDateTime++; // с этой строчкой работает, без нее - нет
            SetFileTime(hFile, 0, 0, &ft);
            char cBuf = 0x77;
            DWORD dwWritten;
            WriteFile(hFile, &cBuf, 1, &dwWritten, NULL);
            GetFileTime(hFile, 0, 0, &ft);
            CloseHandle(hFile);
        }
        return 0;
}


Такое впечатление, что установка того времени, что и так там стоит, тоже блокирует дальнейшие изменения при записи.
Re[3]: только гипотеза
Здравствуйте, Fortnum, Вы писали:

Проверил на чистом Win API, эффект есть как ты его описал.

F>Смущает то, что такая "неправильная" последовательность — в 100% случаев. Попробовал добавить аж 30-секундную задержку, до и после FileStream.Write() — не помогает. Добавил (мало ли) сразу после FileStream.Write — FileStream.Flush(true) — нет, время lastWriteTime все так же не меняется. А еще, если вместо времени в SetFileTime передать 0xFFFFFFFF, то и GetFileTime не потребуется — время, собственно, не меняется, но lastWriteTime перестает изменяться. В MSDN написано об этом, но только в отношении lastAccessTime.


Нет, в отношении lastWriteTime тоже

lpLastWriteTime [in, optional]
A pointer to a FILETIME structure that contains the new last modified date and time for the file or directory. This parameter can be NULL if the application does not need to change this information.
To prevent file operations using the given handle from modifying the last access time, call SetFileTime immediately after opening the file handle and pass a FILETIME structure whose dwLowDateTime and dwHighDateTime members are both set to 0xFFFFFFFF.

http://msdn.microsoft.com/ru-ru/library/windows/desktop/ms724933(v=vs.85).aspx


>Плюс есть еще пара неточностей в документации по SetFileTime: http://www.rsdn.ru/forum/dotnet/5773006
Автор: Fortnum
Дата: 07.09.14
В частности, написано, что такой эффект должен наблюдаться только при передаче 0xFFFFFFFF, а он по факту наблюдается при передаче любой метки времени.


Да. Странно.

Но вот если хоть чуть-чуть изменить время, то все начинает правильно работать


int main(int argc, _TCHAR* argv[])
{
        while (true)
        {
            HANDLE hFile = CreateFile("TestFile.txt", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, 0, 0);
            FILETIME ft;
            GetFileTime(hFile, 0, 0, &ft);
            printf("%u\n", ft.dwLowDateTime);
            FILETIME ft1 = { 0 };
            ft.dwLowDateTime++; // с этой строчкой работает, без нее - нет
            SetFileTime(hFile, 0, 0, &ft);
            char cBuf = 0x77;
            DWORD dwWritten;
            WriteFile(hFile, &cBuf, 1, &dwWritten, NULL);
            CloseHandle(hFile);
        }
        return 0;
}


Такое впечатление, что установка того времени, что и так там стоит, тоже блокирует дальнейшие изменения при записи.

P.S. Хорошо, что на RSDN появилось редактирование