[英]Caching FileInfo properties in C#
从FileInfo.Name
属性的MSDN 文档中,我看到该属性的数据在第一次调用时被缓存,并且只会在随后使用Refresh
方法进行更新。
我有以下在文档中找不到或不太清楚的问题:
所有属性的数据是否同时缓存?
Refresh
方法是在创建FileInfo
时调用,还是仅在第一次调用属性时调用?
如果我调用了一个属性,例如Name
属性,并且它被称为Refresh
,将第一次调用不同的属性,例如DirectoryName
属性,导致它再次调用Refresh
,或者它仅由访问的第一个属性调用在整个 class 中(参见问题#1 )?
我可以通过手动调用Refresh
来预缓存所有属性吗? (假设它没有在构建对象时预先缓存)
手动调用Refresh
是否会导致预缓存的属性(例如CreationTime
)也被刷新?
估计是的。 FileInfo
仅获取您之前获取的属性似乎有点弄巧成拙的“优化”,尤其是当它们可以(并且可能)全部在一个 API 调用中获取时。
文档调用提供已缓存FileInfo
的DirectoryInfo
方法这一事实非常强烈地表明(对我来说,无论如何)简单地构造FileInfo
不会缓存任何东西。 这是有道理的——如果你直接构造一个FileInfo
,它可能引用一个还不存在的文件(例如,你计划创建它),而所有返回缓存FileInfo
的方法都引用存在于快照的时间,假设您将至少使用其中的一些。
不,根据我对问题 1 的回答。这就是 Refresh 方法存在的原因。
我想是这样(见答案1)。
是的。 见答案 3。
如果 FileSystemInfo object 的当前实例是从以下任一 DirectoryInfo 方法返回的,则 CreationTime 属性的值会被预先缓存:
- 获取目录
- 获取文件
- 获取文件系统信息
- 枚举目录
- 枚举文件
- 枚举文件系统信息
要获取最新值,请调用 Refresh 方法。
如果 FileSystemInfo object 中描述的文件不存在,则此属性将返回 1601 年 1 月 1 日午夜 12:00 (CE) 协调世界时 (UTC),调整为本地时间。
NTFS 格式的驱动器可能会在短时间内缓存文件元信息,例如文件创建时间。 此过程称为文件隧道。 因此,如果您要覆盖或替换现有文件,可能需要显式设置文件的创建时间。
( MSDN )
在内部, Refresh
调用标准 Win32API 并因此填充所有属性。
[...]
flag2 = Win32Native.GetFileAttributesEx(path, 0, ref data);
访问指定为 Refresh 的任何属性都会导致完全刷新,例如:
public DateTime LastAccessTimeUtc
{
[SecuritySafeCritical]
get
{
if (this._dataInitialised == -1)
{
this._data = default(Win32Native.WIN32_FILE_ATTRIBUTE_DATA);
this.Refresh();
}
[...]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.