.net windows资源管理器在哪里存储文件元数据?

.net windows资源管理器在哪里存储文件元数据?,.net,winapi,windows-7,metadata,explorer,.net,Winapi,Windows 7,Metadata,Explorer,在Windows7中,我可以将元数据添加到文件中,例如标题、评级等。这些元数据存储在哪里?对于NTFS,他们可能会使用备用数据流,但我认为这些元数据碰巧也在FAT32中工作,那么他们是如何做到的呢?是否有使用此功能的API?从Windows Vista开始,现在存储在文件本身中。Windows将此存储在中。实现要么在文件本身(Office文档支持此功能,要么在支持结构化存储的任何文件格式)中,要么在NTFS本身中 API可在以下位置获得:。有趣的功能是 以下是有关NTFS实施的一些详细信息: 在

在Windows7中,我可以将元数据添加到文件中,例如标题、评级等。这些元数据存储在哪里?对于NTFS,他们可能会使用备用数据流,但我认为这些元数据碰巧也在FAT32中工作,那么他们是如何做到的呢?是否有使用此功能的API?

从Windows Vista开始,现在存储在文件本身中。

Windows将此存储在中。实现要么在文件本身(Office文档支持此功能,要么在支持结构化存储的任何文件格式)中,要么在NTFS本身中

API可在以下位置获得:。有趣的功能是

以下是有关NTFS实施的一些详细信息:

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

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

Windows资源管理器以统一的方式显示属性,这可能会诱使您认为它们都来自同一个商店。但事实并非如此

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

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

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

在API级别处理属性时,也不必担心属性存储在何处。有关入口点,请参阅和COM接口

在幕后,Windows Vista和更高版本提供了了解文件类型以及如何读取和写入其属性的属性处理程序。您可以编写自己的属性处理程序(使用COM)并将其添加到资源管理器(作为所谓的shell扩展)

我发现的最有用的文档是。他做了一系列关于财产制度的报道。这是一个非常有用的教程,对我使用Windows7来说,它100%有效

不要按照本页另一个回复中给出的建议阅读COM结构化存储。这仅适用于特定的文件类型。在:

明白了:许多人错误地调用了
StgOpenStorageEx
。不要那样做
StgOpenStorageEx
仅支持特定格式,如OLE复合文档或NTFS辅助流存储
StgOpenStorageEx
不知道如何从
.JPG
图像读取EXIF头


由于您询问的是.Net,因此可以使用nuget中的库访问文件属性。它为用户提供了.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;
         }
   }
}

它是否与相关?不,正如我所说,因为它也适用于FAT,所以不能涉及其他数据流,因为FAT在FAT和NTFS上都不支持它们,它们可以使用扩展属性()当然,它只适用于某些文件类型。例如,它永远不会对文本文件起作用!COM结构化存储是一种较旧的API。OP询问的资源管理器中显示的属性(标题、评级->思考媒体文件)可以通过和访问。这与COM结构化存储不同。-1表示“这真的取决于情况,你真的不必担心,也不应该担心。”了解幕后发生的事情有助于调试其他人做了一些非常愚蠢的事情,然后将其放在你的办公桌上。如果我想知道如果我迁移到Linux,我的标记是否可用呢?我应该花时间通过Windows的内置属性系统添加元数据,还是找一个第三方解决方案?如果您正在考虑维护归档文件,了解数据存储的位置非常重要。