FileInfo的属性是否保存在内存中?

时间:2012-11-02 11:23:48

标签: c# .net

在执行类似... = myFileInfo.FullName的操作时 - 是否访问驱动器或是否通过创建myFileInfo将其加载到内存中?

1 个答案:

答案 0 :(得分: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文章中推断出缓存此数据的原因:

  

如果要多次重复使用对象,请考虑使用   FileInfo的实例方法而不是相应的静态   File类的方法,因为安全检查并不总是如此   必要的。

它显然会缓存这些数据,以避免每次都花费SecurityCheck,让用户调用Refresh并决定何时支付此费用。