在整理照片/視頻時想根據實際拍攝時間重命名文件,但 System.IO.FileInfo 只能獲取到文件的創建時間或最后寫入時間,不符合要求,遂尋找解決方案
方案 1: System.Drawing
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
-
[How to use Shell32 within a C# application?](How to use Shell32 within a C# application?)
-
Exception when using Shell32 to get File extended properties
操作步驟:
-
添加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
方案 3: 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();
}
此方法完全符合要求,支持所有類型的文件。同時也可以獲取文件的其他信息,如作者等