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 文章中推断出缓存此数据的原因:

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

它显然会缓存这些数据以避免每次安全检查的费用,让用户调用 Refresh 并决定何时支付此费用。

于 2012-11-02T11:27:36.677 回答