如何解决在C#中缓存FileInfo属性
| 从MSDN文档中的“ 0”属性,我看到该属性的数据是在第一次调用时被缓存的,并且随后只会使用“ 1”方法进行更新。 我有以下在文档中找不到或不太清楚的问题: 所有属性的数据是否同时缓存? 是在创建FileInfo
时才调用Refresh
方法,还是仅在首次调用属性时才调用Refresh
方法?
如果我叫过一个物业,例如Name
属性(称为Refresh
)将调用其他属性,例如DirectoryName
属性,第一次使它再次调用Refresh
,还是仅由整个类中访问的第一个属性调用(请参阅问题1)?
我可以通过手动调用ѭ1来预缓存所有属性吗? (假设它没有在构造对象时预先缓存)
手动调用ѭ1是否会导致属性被预先缓存,例如CreationTime
,还需要刷新吗?
解决方法
猜测是的。
FileInfo
只获取您之前获取的属性似乎有点不自在的“优化”,尤其是当它们可以(并且很可能)在一个API调用中全部获取时。
该文档指出了服务已缓存的FileInfo
的DirectoryInfo
方法这一事实非常强烈地(无论如何对我而言)表明,仅构造FileInfo
不会缓存任何内容。这是有道理的-如果直接构造一个,3,它可能会引用一个尚不存在的文件(例如,您打算创建该文件),而所有返回已缓存ѭ3的方法都引用了该文件。假设您至少要使用其中一些快照时间。
不,根据我对问题1的回答。这就是为什么使用Refresh方法的原因。
我会这样想(请参阅答案1)。
是。参见答案3。
,
如果当前是当前值,则将预先缓存CreationTime属性的值
FileSystemInfo对象的实例是从任何
以下DirectoryInfo方法:
获取目录
获取文件
GetFileSystemInfos
枚举目录
枚举文件
枚举文件系统信息
要获取最新值,请调用Refresh方法。
如果FileSystemInfo对象中描述的文件不存在,
此属性将在公元1601年1月1日午夜12:00返回
协调世界时(UTC),调整为本地时间。
NTFS格式的驱动器可能会缓存文件元信息,例如文件创建
时间,短时间。此过程称为文件
隧道。因此,可能有必要明确设置
如果您要覆盖或替换文件的文件创建时间
现有文件。
(MSDN)
在内部,ѭ1调用标准Win32API,从而填充所有属性。
[...]
flag2 = Win32Native.GetFileAttributesEx(path,ref data);
访问指定为“刷新”的任何属性都会导致完全刷新,例如:
public DateTime LastAccessTimeUtc
{
[SecuritySafeCritical]
get
{
if (this._dataInitialised == -1)
{
this._data = default(Win32Native.WIN32_FILE_ATTRIBUTE_DATA);
this.Refresh();
}
[...]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。