繁体   English   中英

在 C# 中缓存 FileInfo 属性

[英]Caching FileInfo properties in C#

FileInfo.Name属性的MSDN 文档中,我看到该属性的数据在第一次调用时被缓存,并且只会在随后使用Refresh方法进行更新。

我有以下在文档中找不到或不太清楚的问题:

  1. 所有属性的数据是否同时缓存?

  2. Refresh方法是在创建FileInfo时调用,还是仅在第一次调用属性时调用?

  3. 如果我调用了一个属性,例如Name属性,并且它被称为Refresh ,将第一次调用不同的属性,例如DirectoryName属性,导致它再次调用Refresh ,或者它仅由访问的第一个属性调用在整个 class 中(参见问题#1 )?

  4. 我可以通过手动调用Refresh来预缓存所有属性吗? (假设它没有在构建对象时预先缓存)

  5. 手动调用Refresh是否会导致预缓存的属性(例如CreationTime )也被刷新?

  1. 估计是的。 FileInfo仅获取您之前获取的属性似乎有点弄巧成拙的“优化”,尤其是当它们可以(并且可能)全部在一个 API 调用中获取时。

  2. 文档调用提供已缓存FileInfoDirectoryInfo方法这一事实非常强烈地表明(对我来说,无论如何)简单地构造FileInfo不会缓存任何东西。 这是有道理的——如果你直接构造一个FileInfo ,它可能引用一个还不存在的文件(例如,你计划创建它),而所有返回缓存FileInfo的方法都引用存在于快照的时间,假设您将至少使用其中的一些

  3. 不,根据我对问题 1 的回答。这就是 Refresh 方法存在的原因。

  4. 我想是这样(见答案1)。

  5. 是的。 见答案 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM