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