在执行类似... = myFileInfo.FullName
的操作时 - 是否访问驱动器或是否通过创建myFileInfo将其加载到内存中?
答案 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并决定何时支付此费用。