3

次のようなことをするとき... = myFileInfo.FullName-ドライブにアクセスしますか、それともmyFileInfoの作成でメモリにロードされますか?

4

1 に答える 1

8

はい、メモリに保存されます。これは、 FileInfoクラスを作成し、最初にプロパティにアクセスしたときのファイルのスナップショットです。Refreshメソッドを呼び出して、プロパティが最新であることを確認できます。

Fileクラスの静的メンバーを使用して、その時点でファイル情報を読み取ることもできますが、これは毎回セキュリティ チェックのオーバーヘッドが発生します。

これについての私の証拠は、ILSpyを使用することから得られます。Length のようなプロパティにアクセスすると、次のことがわかります。

    public long Length
    {
        [SecuritySafeCritical]
        get
        {
            if (this._dataInitialised == -1)
            {
                base.Refresh();
            }
            if (this._dataInitialised != 0)
            {
                __Error.WinIOError(this._dataInitialised, base.DisplayPath);
            }
            if ((this._data.fileAttributes & 16) != 0)
            {
                __Error.WinIOError(2, base.DisplayPath);
            }
            return (long)this._data.fileSizeHigh << 32 | ((long)this._data.fileSizeLow & (long)((ulong)-1));
        }
    }

次に、内部データが初期化されていない場合は、Refresh が呼び出されます。

public void Refresh()
{
    this._dataInitialised = File.FillAttributeInfo(this.FullPath, ref this._data, false, false);
}

これにより、後続のチェックのためにデータが入力されます。そのため、Refresh を再度呼び出さない限り、最初にプロパティにアクセスした時点からデータが取得されます。

このデータをキャッシュする理由は、FileInfo MSDN の記事から推測されます。

オブジェクトを何度か再利用する場合は、File クラスの対応する静的メソッドではなく、FileInfo のインスタンス メソッドを使用することを検討してください。セキュリティ チェックは必ずしも必要ではないためです。

毎回 SecurityCheck のコストを回避するために、明らかにこのデータをキャッシュし、ユーザーが Refresh を呼び出して、このコストをいつ支払うかを決定する必要があります。

于 2012-11-02T11:27:36.677 に答える