当执行类似的操作时... = myFileInfo.FullName
- 它是访问驱动器还是通过创建 myFileInfo 将其加载到内存中?
问问题
468 次
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 回答