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。可以通过IShellItem2IPropertyStore 访问OP 询问的资源管理器中显示的属性(标题、评级-> 认为媒体文件)。这与 COM 结构化存储不同。【参考方案3】:

在 Windows 7 中,我可以 [使用资源管理器] 将元数据添加到文件中,例如标题、评级等。这些元数据具体存储在哪里?

此元数据称为属性。从 Windows Vista 开始,它就以这种方式提供。

Windows 资源管理器以统一的方式呈现属性,这可能会让您误以为它们都来自同一家商店。但事实并非如此。

属性通过 API 公开给程序员。 (见下文。)

它们的具体存储位置是实现细节。这取决于文件类型和属性类型。例如,文件系统时间戳作为属性公开。媒体文件元数据(例如图像的 EXIF 或 MP3 的 ID3 标签)存储在文件本身中。还有其他元数据可能存储在您正在检查其属性的文件随附的 XML 文件中。

那么它存储在哪里?答案是:这真的取决于,你真的不必担心,也不应该担心。因为,正如我所说,它是一个实现细节,就编程而言,担心实现细节意味着绕过 API。

在 API 级别处理属性时,您不必担心属性存储在哪里。请参阅IShellItem2IPropertyStore 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 资源管理器在哪里存储文件元数据?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 配置管理器在哪里找的?

ubuntu 资源管理器 在哪里打开

win7资源管理器在哪

BeeGFS元数据管理设计思想剖析

BeeGFS元数据管理设计思想剖析

BeeGFS元数据管理设计思想剖析