Кэширование свойств FileInfo в С#
Из документации MSDN для свойства FileInfo.Name
, я вижу, что данные для свойства кэшируются при первом вызове и будет обновляться позже, используя метод Refresh
.
У меня есть следующие вопросы, которые я не могу найти или не слишком ясен в документации:
-
Являются ли данные для всех свойств кэшированными одновременно?
-
Вызывается метод Refresh
при создании FileInfo
или только когда свойство вызывается в первый раз?
-
Если я назвал одно свойство, например. свойство Name
, и оно называется Refresh
, вызовет другое свойство, например. свойство DirectoryName
, в первый раз заставляет его снова вызвать Refresh
или вызывается только первым свойством, доступным во всем классе (см. вопрос №1)?
-
Можно ли предварительно кэшировать все свойства, вызвав Refresh
вручную? (Предполагая, что он не был предварительно кэширован при построении объекта)
-
Позволяет ли вызов Refresh
вручную вызывать свойства pre-cached, например. CreationTime
, чтобы быть обновленным также?
Ответы
Ответ 1
-
Угадайте, да. Похоже, что немного "оптимизирована" для FileInfo
для получения только тех свойств, которые вы набрали раньше, особенно когда они могут быть (и, вероятно, все) выбраны в один вызов API.
-
Тот факт, что документация вызывает методы DirectoryInfo
, которые обслуживают уже кэшированные FileInfo
, предлагает довольно сильно (для меня, во всяком случае), что простое создание FileInfo
ничего не кэширует. Это имеет смысл - если вы непосредственно создаете FileInfo
, это может относиться к файлу, который еще не существует (вы планируете его создать, например), тогда как все методы, возвращающие кешированные FileInfo
, относятся к файлам, которые существуют во время моментального снимка, в предположении, что вы собираетесь использовать хотя бы некоторые из них.
-
Нет, отвечая на вопрос 1. Вот почему существует метод Refresh.
-
Я бы так подумал (см. ответ 1).
-
Да. См. Ответ 3.
Ответ 2
Значение свойства CreationTime предварительно кэшируется, если текущий экземпляр объекта FileSystemInfo был возвращен из любого из следующие методы DirectoryInfo:
- GetDirectories
- GetFiles
- GetFileSystemInfos
- EnumerateDirectories
- EnumerateFiles
- EnumerateFileSystemInfos
Чтобы получить последнее значение, вызовите метод Refresh.
Если файл, описанный в объекте FileSystemInfo, не существует, это свойство вернется 12:00 полночь, 1 января 1601 года A.D. (C.E.) Скоординированное универсальное время (UTC), скорректированное на местное время.
Диски в формате NTFS могут кэшировать метаинформацию файла, такую как создание файла время, в течение короткого периода времени. Этот процесс известен как файл туннелирование. В результате может потребоваться явно установить время создания файла, если вы переписываете или заменяете существующий файл.
(MSDN)
Внутри Refresh
вызывает стандартный Win32API и, таким образом, заполняет все свойства.
[...]
flag2 = Win32Native.GetFileAttributesEx(path, 0, ref data);
Доступ к любому свойству Refresh вызывает полное обновление, например:
public DateTime LastAccessTimeUtc
{
[SecuritySafeCritical]
get
{
if (this._dataInitialised == -1)
{
this._data = default(Win32Native.WIN32_FILE_ATTRIBUTE_DATA);
this.Refresh();
}
[...]