C#中移动文件后无法获取文件实际创建日期求助
解决跨文件夹移动后无法获取文件实际创建日期的问题
哈哈,这个问题我太有共鸣了!之前处理文件批量迁移的时候踩过一模一样的坑,当时盯着返回的日期懵了半天🤦♂️
问题根源
其实这和Windows文件系统的机制直接相关:
- 如果是同一个磁盘卷内移动文件:系统只是修改了文件的目录引用,文件本身没有被重新创建,所以
File.GetCreationTime(file)能正常返回原始创建日期。 - 如果是跨磁盘卷移动文件:系统本质上是把文件复制到目标卷,再删除原文件。这时候目标卷的新文件会被标记为“创建于复制时刻”,所以
File.GetCreationTime返回的就是移动操作的当前日期,而非原始创建时间。
解决方案分两种情况处理
1. 提前规划:移动文件时保留原始创建日期
如果还没执行移动操作,或者可以重新移动,直接在移动后手动同步源文件的创建时间就行:
FileInfo sourceFile = new FileInfo(@"C:\OldFolder\example.txt"); FileInfo destFile = new FileInfo(@"D:\NewFolder\example.txt"); // 执行移动操作 sourceFile.MoveTo(destFile.FullName); // 同步源文件的创建时间到目标文件 destFile.CreationTime = sourceFile.CreationTime; destFile.CreationTimeUtc = sourceFile.CreationTimeUtc;
这样后续用File.GetCreationTime(destFile.FullName)就能拿到原始日期了。
2. 事后补救:已移动文件如何找回原始创建日期
如果文件已经被移动,分两种场景:
- 带内置元数据的文件(图片、Office文档等):这类文件会把原始创建时间存在自身的元数据里,比如图片的Exif信息、Word文档的属性。可以通过读取元数据获取:
比如读取图片的Exif创建时间(用System.Drawing举例):using (Image image = Image.FromFile(destFile.FullName)) { PropertyItem propItem = image.GetPropertyItem(36867); // Exif创建时间的Tag ID string originalDate = Encoding.ASCII.GetString(propItem.Value).Trim('\0'); DateTime originalCreationTime = DateTime.ParseExact(originalDate, "yyyy:MM:dd HH:mm:ss", null); } - 普通文件(文本、压缩包等无内置元数据):如果没有提前备份源文件的创建时间,基本没办法恢复了——除非你有系统日志、第三方文件管理工具的记录,或者原文件还在回收站里。
另外还有一个通用方法:利用Windows Shell的扩展属性读取“原始创建时间”,需要引用Microsoft.WindowsAPICodePack.Shell NuGet包:
using Microsoft.WindowsAPICodePack.Shell; using Microsoft.WindowsAPICodePack.Shell.PropertySystem; ShellFile shellFile = ShellFile.FromFilePath(destFile.FullName); object originalDateObj = shellFile.Properties.GetProperty(SystemProperties.System.FileOriginalDate).ValueAsObject; DateTime originalCreationTime = (DateTime)originalDateObj;
这个属性会优先返回文件的原始创建时间,不管是否跨卷移动(前提是文件系统支持并保留了该属性)。
总结
- 同卷移动:
File.GetCreationTime直接可用; - 跨卷移动:要么提前手动同步时间,要么读取文件元数据/Shell扩展属性来获取原始日期。
内容的提问来源于stack exchange,提问作者pratham thakur
相关产品推荐
相关产品推荐

