Где Windows Explorer хранит метаданные файла? - PullRequest
10 голосов
/ 21 мая 2011

В Windows 7 я могу добавлять метаданные в файлы, например, заголовок, рейтинг и так далее.Где именно хранятся эти метаданные?Для NTFS они могут использовать альтернативные потоки данных, но у меня эти метаданные также работают в FAT32, так как они это делают?Есть ли API для использования этой функции?

Ответы [ 4 ]

2 голосов
/ 21 мая 2011

Windows сохраняет это в структурированном хранилище COM .Реализация может быть либо в самом файле (документы Office поддерживают это, либо в любом формате файла, который поддерживает структурированное хранилище), либо в самой NTFS.

API доступен здесь: Структурированное хранилище .Интересная функция: StgOpenStorageEx .

Вот некоторые подробности о реализации NTFS: Реализация файловой системы IPropertySetStorage-NTFS

2 голосов
/ 29 апреля 2014

В Windows 7 я могу добавлять метаданные в файлы [с помощью Проводника], например, заголовок, рейтинг и так далее. Где именно хранятся эти метаданные?

Эти метаданные называются properties . Это доступно с Windows Vista.

Проводник Windows представляет свойства унифицированно, что может заставить вас думать, что все они из одного магазина. Но это не тот случай.

Свойства предоставляются программисту через API. (См. Ниже.)

Где именно они хранятся - это детали реализации. Это зависит от типа файла и типа свойства. Например, временные метки файловой системы отображаются как свойства. Метаданные мультимедийного файла, такие как EXIF ​​для изображений или теги ID3 для MP3, хранятся в самом файле. Другие метаданные могут храниться в файле XML, сопровождающем файл, свойства которого вы проверяете.

Так где это хранится? Ответ таков: это действительно зависит, и вам действительно не нужно ни беспокоиться, ни беспокоиться. Потому что, как я уже сказал, это деталь реализации, а что касается программирования, то забота о деталях реализации означает обход API.

Вам также не нужно беспокоиться о том, где хранятся свойства при работе с ними на уровне API. См. IShellItem2 и IPropertyStore COM-интерфейсы для точки входа.

Под капотом Windows Vista и более поздние версии поставляют обработчиков свойств , которые знают о типах файлов и о том, как читать и записывать их свойства. Вы можете написать свой собственный обработчик свойств (используя COM) и добавить его в Explorer (как так называемое расширение оболочки ).

Самая полезная документация, которую я нашел, - это записи в блоге Бена Караса во время выпуска Vista, начинающегося в августе 2006 года . Он сделал целую серию по системе собственности. Это очень полезный учебник, и для меня, используя Windows 7, он сработал на 100%.

Не следуйте советам, данным в другом ответе на этой странице, чтобы прочитать о COM Structured Storage . Это только для определенных типов файлов. В словах Бена Караса :

Попался: многие люди ошибочно называют StgOpenStorageEx. Не делай этого! StgOpenStorageEx поддерживается только для определенных форматов, таких как OLE Compound Documents или хранилище вторичного потока NTFS. StgOpenStorageEx не знает, как прочитать заголовок EXIF ​​из .JPG изображения.

2 голосов
/ 21 мая 2011

Начиная с Windows Vista, метаданные теперь хранятся внутри самого файла.

0 голосов
/ 20 января 2016

Поскольку вы спрашиваете о .Net, вы можете получить доступ к свойствам файла с помощью библиотеки Microsoft.WindowsAPICodePack-Shell из nuget.Он предоставляет интерфейс .Net для Свойства Windows .

Пример использования библиотеки следующий:

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;
         }
   }
}
...