C# 获取文件详细备注信息 (如图片、视频实际创建时间)


在整理照片/视频时想根据实际拍摄时间重命名文件,但 System.IO.FileInfo 只能获取到文件的创建时间或最后写入时间,不符合要求,遂寻找解决方案

方案 1: System.Drawing

  1. c#从相机拍摄的照片中提取拍摄时间
static void Main(string[] args)
{
	var file = @"D:\image\IMG_6789.JPG";

	var image = Image.FromFile(file);
	var propItems = image.PropertyItems;

	var propItem = image.GetPropertyItem(0x9003); //Id 为 0x9003 表示拍照的时间
	var propItemValue = propItem.Value;

	image.Dispose();

	var dateTimeStr = System.Text.Encoding.ASCII.GetString(propItemValue).Trim('\0');

	var dt = DateTime.ParseExact(dateTimeStr, "yyyy:MM:dd HH:mm:ss", CultureInfo.InvariantCulture);

	Console.WriteLine(dt);
}

此方法仅适用于图片:pass

方案 2: shell32

  1. C#通过shell32获取文件详细备注信息

  2. [How to use Shell32 within a C# application?](How to use Shell32 within a C# application?)

  3. Exception when using Shell32 to get File extended properties

操作步骤:

  1. 添加shell32引用 (C:\Windows\System32\shell32.dll 或 在 VS 中添加引用 .COM -> Microsoft Shell Controls and Automation)

  2. 设置 dll "嵌入互操作类型" 为 false

static void Main(string[] args)
{
	var file = @"D:\image\IMG_6789.JPG";

	var shell = new ShellClass();
	var dir = shell.NameSpace(Path.GetDirectoryName(file));
	var item = dir.ParseName(Path.GetFileName(file));

	var dateTimeStr = dir.GetDetailsOf(item, 12);// 12 为照片拍摄时间
}

此方法适用于图片和视频(id 不同),但是在实际中获取到的时间字符串包含乱码无法转换成时间:pass

方案 3: Microsoft.WindowsAPICodePack.Shell (采用方案)

  1. how-do-i-find-the-date-a-video-avi-mp4-was-actually-recorded

  2. Microsoft.WindowsAPICodePack-Shell

static void Main(string[] args)
{
	var file = @"D:\image\IMG_6789.JPG";

	ShellObject obj = ShellObject.FromParsingName(file);
	var takenDate = obj.Properties.System.ItemDate.Value;

	Console.WriteLine(takenDate);

	Console.ReadLine();
}

此方法完全符合要求,支持所有类型的文件。同时也可以获取文件的其他信息,如作者等

开源地址


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM