Кэширование свойств 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();
        }
        [...]