【问题标题】:Caching FileInfo properties in C#在 C# 中缓存 FileInfo 属性
【发布时间】:2011-09-14 02:27:32
【问题描述】:
从FileInfo.Name 属性的MSDN documentation 中,我看到该属性的数据在第一次调用时被缓存,并且只会在随后使用Refresh 方法更新。
我有以下在文档中找不到或不太清楚的问题:
是否同时缓存所有属性的数据?
是在创建FileInfo 时调用Refresh 方法,还是仅在第一次调用属性时调用?
如果我调用了一个属性,例如Name 属性,它被称为 Refresh,将调用不同的属性,例如DirectoryName 属性,第一次导致它再次调用Refresh,还是仅由整个类中访问的第一个属性调用(参见问题#1)?
我可以通过手动调用Refresh 来预缓存所有属性吗? (假设它没有在构建对象时预先缓存)
是否手动调用 Refresh 会导致属性为 pre-cached,例如CreationTime,也要刷新?
【问题讨论】:
标签:
c#
caching
.net
fileinfo
【解决方案1】:
-
猜测是的。 FileInfo 仅获取您之前获取的属性似乎有点弄巧成拙的“优化”,尤其是当它们可以(并且可能)全部在 one API call 中获取时。
文档调用 DirectoryInfo 提供已缓存 FileInfos 的方法这一事实非常强烈地表明(无论如何对我而言)简单地构造 FileInfo 不会缓存任何内容。这是有道理的——如果你直接构造一个FileInfo,它可能引用一个还不存在的文件(例如你计划创建它),而所有返回缓存FileInfos 的方法都引用文件快照时存在,假设您将使用至少 一些。
不,根据我对问题 1 的回答。这就是 Refresh 方法存在的原因。
我想是的(见答案 1)。
是的。见答案 3。
【解决方案2】:
CreationTime 属性的值是预先缓存的,如果当前
FileSystemInfo 对象的实例是从任何
以下 DirectoryInfo 方法:
- 获取目录
- 获取文件
- 获取文件系统信息
- 枚举目录
- 枚举文件
- 枚举文件系统信息
要获取最新值,请调用 Refresh 方法。
如果 FileSystemInfo 对象中描述的文件不存在,
此住宿将于公元 1601 年 1 月 1 日午夜 12:00 归还
协调世界时 (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();
}
[...]