为何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
相关产品推荐
相关产品推荐

