在整理照片/视频时想根据实际拍摄时间重命名文件,但 System.IO.FileInfo 只能获取到文件的创建时间或最后写入时间,不符合要求,遂寻找解决方案
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
操作步骤:
添加shell32引用 (C:\Windows\System32\shell32.dll 或 在 VS 中添加引用 .COM -> Microsoft Shell Controls and Automation)
设置 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
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();
}
此方法完全符合要求,支持所有类型的文件。同时也可以获取文件的其他信息,如作者等
原文:https://www.cnblogs.com/victorbu/p/10349702.html