我有一个简单的 WCF 服务,可以让客户/消费者向它上传图像、音频或视频文件。上传后,服务应该分析文件并以某种方式检索以下属性:
图片:宽度、高度、拍摄日期、使用的程序
音频:运行时间、艺术家、专辑、流派、比特率、出版年份
视频:运行时间、宽度、高度、帧/秒、视频比特率、音频比特率
显然 Windows 可以很容易地获取和显示这些属性,但我如何在 C# 中做到这一点?
我有一个简单的 WCF 服务,可以让客户/消费者向它上传图像、音频或视频文件。上传后,服务应该分析文件并以某种方式检索以下属性:
图片:宽度、高度、拍摄日期、使用的程序
音频:运行时间、艺术家、专辑、流派、比特率、出版年份
视频:运行时间、宽度、高度、帧/秒、视频比特率、音频比特率
显然 Windows 可以很容易地获取和显示这些属性,但我如何在 C# 中做到这一点?
礼貌这个线程。
我已经验证这会获取所有文件属性,包括扩展属性。
在您的项目中,转到“添加引用”-> COM->“Microsoft Shell 控件和自动化”
添加它,再次由所述线程提供,一个 C# 方法来读取目录中文件的属性。(我仍在研究是否可以在特定文件上执行此功能。如果不是,您始终可以传递有问题的文件名并验证仅获取该文件的属性。)
public static void Main(string[] args)
{
List<string> arrHeaders = new List<string>();
Shell32.Shell shell = new Shell32.Shell();
Shell32.Folder objFolder;
objFolder = shell.NameSpace(@"C:\temp\testprop");
for( int i = 0; i < short.MaxValue; i++ )
{
string header = objFolder.GetDetailsOf(null, i);
if (String.IsNullOrEmpty(header))
break;
arrHeaders.Add(header);
}
foreach(Shell32.FolderItem2 item in objFolder.Items())
{
for (int i = 0; i < arrHeaders.Count; i++)
{
Console.WriteLine("{0}\t{1}: {2}", i, arrHeaders[i], objFolder.GetDetailsOf(item, i));
}
}
}
访问该信息的最简单方法是让 (Explorer) Shell 为您执行此操作,然后(通过Windows Property System)请求它。从 C# 执行此操作的最简单方法可能是使用适用于 .NET 的 Windows API 代码包。
具体来说,您将希望获得对 Property Store 的访问权限。如需入门帮助,请查看 PropertiesEditDemo 项目的 Samples 文件夹。
您可以通过读取文件的所有元数据来自己完成,但问题是您的程序必须知道所有可用文件类型的所有可用元数据。对于这些知识,我通常更喜欢挂在 Shell 上。