【问题标题】:Caching FileInfo properties in C#在 C# 中缓存 FileInfo 属性
【发布时间】:2011-09-14 02:27:32
【问题描述】:

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

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

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

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

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

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

  5. 是否手动调用 Refresh 会导致属性为 pre-cached,例如CreationTime,也要刷新?

【问题讨论】:

  • 我建议您下载 ILSpy wiki.sharpdevelop.net/ILSpy.ashx 并检查 FileInfo 的实现。这是获得有关 BCL 类型内部细节的详细问题的最佳方法。
  • 我同意。还值得注意的是,现在(好吧,就像现在一样)您可以在线浏览参考源。这是FileInfo definition 的荣耀。

标签: c# caching .net fileinfo


【解决方案1】:
  1. 猜测是的。 FileInfo 仅获取您之前获取的属性似乎有点弄巧成拙的“优化”,尤其是当它们可以(并且可能)全部在 one API call 中获取时。

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

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

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

  5. 是的。见答案 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();
            }
            [...]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      • 2021-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多