在Windows 7中,我可以为文件添加元数据,例如标题、评分等等。这些元数据会存储在哪里呢?对于NTFS文件系统,它们可能使用备用数据流来存储这些元数据,但是如果我使用的是FAT32文件系统,它们是如何实现的呢?是否有API可以利用这个功能呢?
您无需担心在API级别处理属性时,属性存储在何处。请参见IShellItem2
和IPropertyStore
COM接口作为入口。
在幕后,Windows Vista及更高版本提供了知道文件类型以及如何读写其属性的属性处理程序。您可以使用COM编写自己的属性处理程序,并将其添加到资源管理器中(称为shell扩展)。
我发现最有用的文档是Ben Karas'博客文章系列,始于2006年8月Vista发布之际。他对属性系统进行了全面介绍。这是一个非常有用的教程,对于我使用的Windows 7,它已经100%可行。
不要按照本页面上另一个回答中提供的建议阅读关于COM结构化存储的内容。这仅适用于特定的文件类型。根据Ben Karas的话:StgOpenStorageEx
。不要这样做!StgOpenStorageEx
仅支持特定格式,如OLE复合文档或NTFS次要流存储。StgOpenStorageEx
不知道如何从.JPG
图像中读取EXIF头。Windows将此存储在COM结构化存储中。实现要么在文件本身中(Office文档支持此功能,或者支持结构化存储的任何文件格式),要么在NTFS本身中。
这里提供API:Structured Storage。有趣的函数是StgOpenStorageEx。
以下是NTFS实现的一些详细信息:IPropertySetStorage-NTFS文件系统实现
IShellItem2
和IPropertyStore
访问。这与COM Structured Storage不同。 - Lumi如果您问的是 .Net 相关问题,您可以使用来自 nuget 的 Microsoft.WindowsAPICodePack-Shell 库访问文件属性。它为Windows 属性提供了一个 .Net 接口。
该库的一个示例用法如下:
using System;
using Microsoft.WindowsAPICodePack.Shell.PropertySystem;
using Microsoft.WindowsAPICodePack.Shell;
namespace Properties
{
public class PictureFileProperties
{
public string GetCamera(string filename)
{
if (!System.IO.File.Exists(filename))
return null;
ShellObject picture = ShellObject.FromParsingName(filename);
if (picture != null)
{
var manufacturer = picture.Properties.GetProperty(SystemProperties.System.Photo.CameraManufacturer)).Value;
var model = picture.Properties.GetProperty(SystemProperties.System.Photo.CameraModel).Value;
return string.Format("{0} {1}", manufacturer, model);
}
return null;
}
}
}