11

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

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

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

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

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

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

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

4

2 回答 2

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

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

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

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

  5. 是的。见答案 3。

于 2011-06-13T19:10:40.613 回答
2

如果 FileSystemInfo 对象的当前实例是从以下任一 DirectoryInfo 方法返回的,则 CreationTime 属性的值会被预先缓存:

  • 获取目录
  • 获取文件
  • 获取文件系统信息
  • 枚举目录
  • 枚举文件
  • 枚举文件系统信息

要获取最新值,请调用 Refresh 方法。

如果 FileSystemInfo 对象中描述的文件不存在,则此属性将返回 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();
        }
        [...]
于 2012-10-23T13:03:53.933 回答