11

プロパティのMSDNドキュメントから、FileInfo.Nameプロパティのデータは最初に呼び出されたときにキャッシュされ、Refreshメソッドを使用して後でのみ更新されることがわかります。

ドキュメントで見つけられない、またはあまり明確ではない次の質問があります。

  1. すべてのプロパティのデータが同時にキャッシュされていますか?

  2. Refreshメソッドは、の作成時FileInfoに呼び出されますか、それともプロパティが初めて呼び出されたときにのみ呼び出されますか?

  3. あるプロパティ(たとえばNameプロパティ)を呼び出して、それが呼び出されRefreshた場合、別のプロパティ(たとえばDirectoryNameプロパティ)を初めて呼び出すとRefresh、再度呼び出されますか、それともクラス全体でアクセスされた最初のプロパティによってのみ呼び出されますか? (質問#1を参照)?

  4. Refresh手動で呼び出すことですべてのプロパティを事前にキャッシュできますか?(オブジェクトの構築時に事前にキャッシュされていないと仮定します)

  5. 手動で呼び出すと、事前にキャッシュされRefreshているプロパティも更新されますか?CreationTime

4

2 に答える 2

4
  1. 推測では、はい。以前にフェッチしたプロパティのみをフェッチすることは、特に1 つの API 呼び出しFileInfoですべてをフェッチできる (そしておそらくそうである) 場合に、自滅的な「最適化」のように思えます。

  2. DirectoryInfoドキュメントが既にキャッシュされた s を提供するメソッドを呼び出しているという事実は、単純に a を構築するだけでは何もキャッシュしないFileInfoことを (とにかく私には) 非常に強く示唆しています。FileInfoそれは理にかなっています-FileInfo直接構築する場合、それはまだ存在しないファイルを参照する可能性があります(たとえば、作成する予定です)が、キャッシュされたFileInfos を返すすべてのメソッドは、その時点で存在するファイルを参照しますスナップショット、少なくともそれらのいくつかを使用するという仮定の下で。

  3. いいえ、質問 1 に対する私の回答によると、Refresh メソッドが存在するのはそのためです。

  4. 私はそう想像します(回答1を参照)。

  5. はい。回答 3 を参照してください。

于 2011-06-13T19:10:40.613 に答える
2

FileSystemInfo オブジェクトの現在のインスタンスが次の DirectoryInfo メソッドのいずれかから返された場合、CreationTime プロパティの値は事前にキャッシュされます。

  • ディレクトリを取得
  • GetFiles
  • GetFileSystemInfos
  • ディレクトリの列挙
  • ファイルの列挙
  • EnumerateFileSystemInfos

最新の値を取得するには、Refresh メソッドを呼び出します。

FileSystemInfo オブジェクトに記述されているファイルが存在しない場合、このプロパティは、現地時間に調整された西暦 1601 年 1 月 1 日 (CE) 協定世界時 (UTC) の午前 12:00 を返します。

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();
        }
        [...]
于 2012-10-23T13:03:53.933 に答える