Кэширование свойств FileInfo в C # - PullRequest
11 голосов
/ 13 июня 2011

В документации MSDN для свойства FileInfo.Name я вижу, что данные для свойства кэшируются при первом его вызове и впоследствии обновляются только при использовании метода Refresh.

У меня есть следующие вопросы, которые я не могу найти или которые не слишком понятны в документации:

  1. Кэшируются ли данные для всех свойств одновременно?

  2. Вызывается ли метод Refresh при создании FileInfo или только когда свойство вызывается впервые?

  3. Если я назвал одно свойство, например, свойство Name, которое называется Refresh, будет вызывать другое свойство, например свойство DirectoryName в первый раз вызывает его повторный вызов Refresh, или оно вызывается только первым свойством, доступным во всем классе (см. вопрос # 1 )?

  4. Можно ли предварительно кэшировать все свойства, вызывая Refresh вручную? (При условии, что он не был предварительно кэширован при построении объекта)

  5. Вызывает ли Refresh вручную свойства, которые предварительно кэшируются , например CreationTime, а также обновляться?

Ответы [ 2 ]

4 голосов
/ 13 июня 2011
  1. На предположение, да. Похоже на небольшую «потерянную» «оптимизацию» для FileInfo для извлечения только тех свойств, которые вы извлекли раньше, особенно когда они могут (и, вероятно, все) извлекаются в одном вызове API .

  2. Тот факт, что документация вызывает DirectoryInfo методы, которые обслуживают уже кэшированные FileInfo s, достаточно убедительно (для меня, во всяком случае) предполагает, что простое построение FileInfo ничего не кэширует. Это имеет смысл - если вы создаете FileInfo напрямую, он может ссылаться на файл, который еще не существует (например, вы планируете его создать), тогда как все методы, которые возвращают кэшированные FileInfo s, ссылаются на файлы которые существуют во время моментального снимка, при условии, что вы собираетесь использовать по крайней мере некоторых из них.

  3. Нет, моим ответом на вопрос 1. Вот почему существует метод Refresh.

  4. Я бы так и подумал (см. Ответ 1).

  5. Да. Смотрите ответ 3.

2 голосов
/ 23 октября 2012

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

  • GetDirectories
  • GetFiles
  • GetFileSystemInfos
  • EnumerateDirectories
  • EnumerateFiles
  • EnumerateFileSystemInfos

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

Если файл, описанный в объекте FileSystemInfo, не существует, эта собственность вернется в 12:00 полночь, 1 января 1601 г. н.э. Всемирное координированное время (UTC), скорректированное по местному времени.

Диски в формате NTFS могут кэшировать метаинформацию файла, например, создание файла. время, в течение короткого периода времени. Этот процесс известен как файл туннелирование. В результате может возникнуть необходимость явно установить время создания файла, если вы перезаписываете или заменяете существующий файл.

( MSDN )

Внутренне, Refresh вызывает стандартный Win32API и таким образом заполняет все свойства.

[...]
flag2 = Win32Native.GetFileAttributesEx(path, 0, ref data);

Доступ к любому свойству, указанному для обновления, приводит к полному обновлению, например:

public DateTime LastAccessTimeUtc
{
    [SecuritySafeCritical]
    get
    {
        if (this._dataInitialised == -1)
        {
            this._data = default(Win32Native.WIN32_FILE_ATTRIBUTE_DATA);
            this.Refresh();
        }
        [...]
...