.NET FileInfo. LastWriteTime & FileInfo. LastAccessTime неправы

x++;

делает следующее:

int returnValue = x;
x = x+1;
return returnValue;

, Как Вы видите, исходное значение сохраняется, x увеличен, и затем исходное значение возвращается.

то, Что это заканчивает тем, что делало, сохраняет значение 10 где-нибудь, установка x, равная 11, и затем возвращается 10, который заставляет x быть задержанным к 10. Обратите внимание, что x действительно на самом деле становится 11 для нескольких циклов (принимающий компиляторную оптимизацию).

21
задан Aleksandar 5 July 2015 в 17:02
поделиться

4 ответа

Значения FileInfo загружаются только один раз и затем кэшируются. Чтобы получить текущее значение, вызовите Refresh () перед получением свойства:

f.Refresh();
t = f.LastAccessTime;

Другой способ получить текущее значение - использовать статические методы класса File :

t = File.GetLastAccessTime(path);
]
14
ответ дан 29 November 2019 в 20:48
поделиться

Пробовали ли вы вызвать Refresh () непосредственно перед доступом к свойству (чтобы избежать получения кэшированного значения)? Если это не сработает, смотрели ли вы, что одновременно показывает Explorer? Если проводник показывает неверную информацию, то, вероятно, вы не можете решить эту проблему - возможно, информация обновляется, например, только при закрытии дескриптора файла.

4
ответ дан 29 November 2019 в 20:48
поделиться

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

4
ответ дан 29 November 2019 в 20:48
поделиться

Из MSDN:

При первом вызове FileSystemInfo вызывает Refresh и возвращает кэшированная информация об API, чтобы получить атрибуты и так далее. На последующих звонков, вы должны позвонить в Refresh, чтобы получить последняя копия информации.

FileSystemInfo.Refresh ()

Если ваше приложение выполняет запись, я думаю, вам придется «прикоснуться» к файлу, установив свойство LastWriteTime самостоятельно между каждым буфером записываемых данных. Какой-то псевдокод:

while(bytesWritten < totalBytes)
{
   bytesWritten += br.Write(buffer);
   myFileInfo.LastWriteTime = DateTime.Now;
}

Я не уверен, насколько сильно это повлияет на производительность записи.

4
ответ дан 29 November 2019 в 20:48
поделиться