You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何FileSystemInfo.Refresh在文件删除后不更新时间戳?

关于FileInfo删除后Refresh()仍保留旧LastWriteTime的问题

已有多篇文章讲解FileSystemInfo及其派生类FileInfo的缓存行为,但运行以下代码后,原本预期文件删除并调用Refresh()后,LastWriteTime会重置为1601年(如同文件从未存在过),但它仍返回已删除文件的创建时间。根据相关文章,FileInfo会调用原生GetFileAttributesEx函数填充数据,这是否与NTFS文件系统缓存有关?

static void Main(string[] args)
{
    var appFolder = Path.GetDirectoryName(Environment.ProcessPath)!;
    var path = Path.Combine(appFolder, "a.txt");

    var fi = new FileInfo(path);

    fi.Create().Close();
    fi.Refresh();

    PrintFileInfo(fi);

    // Delete here OR using external file manager
    fi.Delete();  
    fi.Refresh();
    Console.WriteLine("File deleted" + Environment.NewLine);

    PrintFileInfo(fi);
}

private static void PrintFileInfo(FileInfo fInfo)
{
    Console.WriteLine($"Name: {fInfo.Name}");
    Console.WriteLine($"File exists?: {fInfo.Exists}");
    Console.WriteLine(fInfo.LastWriteTime.ToString());

    Console.WriteLine();
}

解答

  • 这和NTFS缓存无关,而是FileInfo的设计逻辑导致的。当文件被删除后调用Refresh(),Exists会被正确更新为false,但与文件存在性无关的属性(比如LastWriteTime)并不会被重置。
  • FileInfo的内部缓存机制是:调用Refresh()时会尝试获取文件最新属性;若文件不存在,只会更新Exists标记,之前缓存的属性值会被保留,不会主动清空或重置为默认的1601年基准时间。
  • 原生GetFileAttributesEx函数在文件不存在时会返回错误,此时FileInfo不会更新已缓存的属性字段,仅将Exists设为false。这是框架设计上的选择——优先保证属性的“可用性”:即使文件不存在,只要之前获取过属性,就会保留旧值,除非你创建新的FileInfo实例。
  • 若想获取文件不存在时的默认属性值,正确做法是:确认文件不存在后,创建一个新的FileInfo实例,而非复用旧实例。

内容的提问来源于stack exchange,提问作者Dave

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 14:13:24