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?
  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();
}

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

开源地址

原文地址:https://www.cnblogs.com/victorbu/p/10349702.html

时间: 2024-12-07 03:55:14

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

fsck获取文件的block信息和位置信息

原文链接:lxw的大数据田地 » hdfs fsck命令查看HDFS文件对应的文件块信息(Block)和位置信息(Locations) 关键字:hdfs fsck.block.locations 在HDFS中,提供了fsck命令,用于检查HDFS上文件和目录的健康状态.获取文件的block信息和位置信息等. fsck命令必须由HDFS超级用户来执行,普通用户无权限. [[email protected] ~]$ hdfs fsck Usage: DFSck [-list-corruptfileb

用SHGetFileInfo获取文件类型/图标信息

SHFILEINFO fileInfo; SHGetFileInfo( "C:\\boot.ini", NULL, &fileInfo, sizeof(SHFILEINFO), SHGFI_ICON|SHGFI_TYPENAME); cout<<fileInfo.szTypeName<<"文件"<<endl; cout<<"0x"<<hex<<fileInfo.hIc

FileSystemObject获取文件路径相关信息

GetAbsolutePathName(文件对象) 返回文件对象在系统的绝对路径 GetBaseName(文件对象) 返回文件对象的文件名 GetExtensionName(文件对象) 文件的后缀 GetParentFolderName(文件对象) 取得父级的目录名 GetSpecialFolder(目录代码) 取得系统中一些特别的目录的路径,目录代码有3个分别是 0:安装Window的目录 1:系统文件目录 2:临时文件目录 GetTempName() 生成一个随机的临时文件对象,会以rad带

利用stat命令获取Linux文件系统和文件的详细状态信息

用途:stat命令用于显示文件或文件系统的状态信息,来自于coreutils软件包,一般系统自带此命令工具,它能获取与文件系统及文件相关的许多信息,具体用途见stat的功能选项.这些信息包括inode.atime.ctime.mtime.文件(系统)类型.权限.块大小.符号连接等. 语法:stat [OPTION]... FILE... , 可通过stat --help或man stat获取它的帮助信息 功能选项:功能选项需要结合-c参数使用,如利用stat获取文件的inode信息,则使用sta

获取文件的详细属性,大小,修改日期,所在位置等

asp.net 获得文件属性中的修改时间,获得系统文件属性的方法,最后一次写入时间 1 #region 获取文件的详细属性,大小,修改日期,所在位置等 2 /// <summary> 3 /// 获取文件的详细属性,大小,修改日期,所在位置等 4 /// </summary> 5 /// <param name="files">文件的路径</param> 6 /// <returns></returns> 7 pu

stat()函数--------------获取文件信息

stat():用于获取文件的状态信息,使用时需要包含<sys/stat.h>头文件. 函数原型:int stat(const char *path, struct stat *buf): struct stat { dev_t st_dev;         /* ID of device containing file */ ino_t st_ino;    /* inode number */ mode_t st_mode;  /* protection */ nlink_t st_nli

iOS开发之网络编程--获取文件的MIMEType

前言:有时候我们需要获取文件的MIMEType的信息,下面就介绍关于获取MIMEType的方法. 1.直接百度搜索关键字"MIMEType",你会找到,然后查吧: 2.用代码获取文件的MIMEType信息: 1 #import "GetMIMEType.h" 2 3 #import <MobileCoreServices/MobileCoreServices.h> 4 5 @implementation GetMIMEType 6 7 #pragma m

C#类似windows资源管理器-获取文件图标

在做文件管理器的过程中,有一个非常重要的功能实现,就是对不同的文件类型获取文件的描述信息,以及对文件图标的获取 实现这个功能需要调用Windows API,以及对注册表的操作(代码是看了一些网上写的后根据自己的理解写了一个比较简洁易懂的代码) 下面看代码: //根据扩展名获取图标 public int fileExtIcon(string typeExt, FileInfo f) { if (!extIcon.ContainsKey(typeExt) && typeExt != "

如何在windows下和linux下获取文件(如exe文件)的详细信息和属性

程序员都很懒,你懂的! 最近在项目开发中,由cs开发的exe的程序,需要自动升级,该exe程序放在linux下,自动升级时检测不到该exe程序的版本号信息,但是我们客户端的exe程序需要获取服务器上新程序的版本号信息.最后由我用java实现linux上exe文件的版本号读取功能.下面是详细代码: package com.herman.utils; import java.io.File; import java.io.FileNotFoundException; import java.io.I