Windows 资源管理器在哪里存储文件元数据?
Posted
技术标签:
【中文标题】Windows 资源管理器在哪里存储文件元数据?【英文标题】:Where does windows explorer store file meta data? 【发布时间】:2011-08-30 03:13:55 【问题描述】:在 Windows 7 中,我可以将元数据添加到文件中,例如标题、评级等。这个元数据究竟存储在哪里?对于 NTFS,他们可能会使用备用数据流,但我这个元数据也恰好在 FAT32 中工作,那么他们是如何做到的呢?是否有 API 可以使用此功能?
【问题讨论】:
会不会和this有关? 不,正如我所说,因为它也适用于 FAT,所以不能涉及备用数据流,因为 FAT 不支持它们 在 FAT 和 NTFS 上,它们都可以使用扩展属性 (en.wikipedia.org/wiki/Extended_file_attributes) 【参考方案1】:从 Windows Vista 开始,metadata 现在存储在文件本身中。
【讨论】:
当然它只适用于某些文件类型。例如,它永远不会适用于文本文件!【参考方案2】:Windows 将其存储在 COM Structured storage 中。实现要么在文件本身(Office 文档支持这一点,或任何支持结构化存储的文件格式),要么在 NTFS 本身。
API 可在此处获得:Structured Storage。有趣的函数是StgOpenStorageEx。
以下是有关 NTFS 实施的一些详细信息:IPropertySetStorage-NTFS File System Implementation
【讨论】:
COM 结构化存储是一个较旧的 API。可以通过IShellItem2
和IPropertyStore
访问OP 询问的资源管理器中显示的属性(标题、评级-> 认为媒体文件)。这与 COM 结构化存储不同。【参考方案3】:
在 Windows 7 中,我可以 [使用资源管理器] 将元数据添加到文件中,例如标题、评级等。这些元数据具体存储在哪里?
此元数据称为属性。从 Windows Vista 开始,它就以这种方式提供。
Windows 资源管理器以统一的方式呈现属性,这可能会让您误以为它们都来自同一家商店。但事实并非如此。
属性通过 API 公开给程序员。 (见下文。)
它们的具体存储位置是实现细节。这取决于文件类型和属性类型。例如,文件系统时间戳作为属性公开。媒体文件元数据(例如图像的 EXIF 或 MP3 的 ID3 标签)存储在文件本身中。还有其他元数据可能存储在您正在检查其属性的文件随附的 XML 文件中。
那么它存储在哪里?答案是:这真的取决于,你真的不必担心,也不应该担心。因为,正如我所说,它是一个实现细节,就编程而言,担心实现细节意味着绕过 API。
在 API 级别处理属性时,您不必担心属性存储在哪里。请参阅IShellItem2
和IPropertyStore
COM 接口以获取入口点。
在底层,Windows Vista 和更高版本提供了属性处理程序,这些处理程序了解文件类型以及如何读取和写入其属性。您可以编写自己的属性处理程序(使用 COM)并将其添加到 Explorer(作为所谓的 shell 扩展)。
我发现的最有用的文档是Ben Karas' blog entries around the time of the Vista release starting in August 2006。他已经完成了关于财产系统的整个系列。这是一个非常有用的教程,对于使用 Windows 7 的我来说,它已经 100% 有效。
不要按照本页其他回复中给出的建议来阅读COM 结构化存储。这仅适用于特定的文件类型。在words of Ben Karas:
问题:很多人错误地调用
StgOpenStorageEx
。不要那样做!StgOpenStorageEx
仅支持特定格式,如 OLE 复合文档或 NTFS 辅助流存储。StgOpenStorageEx
不知道如何从.JPG
图像中读取 EXIF 标头。
【讨论】:
-1 表示“这真的取决于,你真的不必担心,也不应该担心。”了解幕后发生的事情有助于调试当其他人做了一些非常愚蠢的事情,然后把它放在你的桌子上。 如果我想知道如果我迁移到 Linux 后我的标签是否可用怎么办?我应该花时间通过 Windows 的内置属性系统添加元数据还是找到第 3 方解决方案?如果您正在考虑维护存档,了解数据的存储位置非常重要。【参考方案4】:由于您询问的是 .Net,因此您可以使用 nuget 中的 Microsoft.WindowsAPICodePack-Shell 库访问文件属性。它为Windows Properties 提供了一个.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;
【讨论】:
以上是关于Windows 资源管理器在哪里存储文件元数据?的主要内容,如果未能解决你的问题,请参考以下文章