Расширенные свойства файлов

Однажды я по ошибке открыл вместо SSMS Windows Explorer. Это ж сколько на свете бывает фолдеров и файлов, обалдеть просто. А свойств-то, свойств у них сколько!

image001

рис.1

Я и малой толики представить себе не мог, что бывают такие свойства. Насколько бедной и приземленной мне показалась функция Dir() – см. пост "Рекурсивные TVF-2". До чего все-таки разнообразно устроен мир! Естественно, сразу возникает желание затащить всю эту красоту в SQL Server, но для этого надо представлять, как до них добраться. Оказалось, что не только я озадачивался этим вопросом. Куда только бедняг не отправляли: в IPropertySetStorage (https://msdn.microsoft.com/en-us/library/aa379840(VS.85).aspx); в ID3-тэги, в EXIF-тэги, в параллельные потоки (https://www.codeproject.com/KB/cs/ntfsstreams.aspx), в заголовки, в хвосты, а некоторых и того дальше. До чего все-таки разнообразно устроен мир! И по большому счету они правы, потому что, например, документы MS Office хранят свои свойства, такие, как author, title, ... вовсе не в стримах, а в OLE Document Storage, а, скажем, длительность, альбом и жанр mp3 там уже искать бестолку. До чего все-таки разнообразно устроен мир! Я уже философствовал на эту тему в теме "Частичное обновление FILESTREAM", там в самом конце. Получается, чтобы добраться до свойств, надо всякий раз писать свой механизм в зависимости от формата файла, и я уже совсем собирался идти изучать матчасть (https://www.wotsit.org/), чтобы достичь хотя бы отдаленно такой же красоты, как в Windows Explorer, как вдруг неожиданно подумалось, а на фига? Добрые люди, писавшие Windows Shell, уже изрядно потрудились на эту тему, дай им бог здоровья. Я не знаю, как они добирались до разных свойств в разных типах файлов, писали ли для каждого формата свой парсер или коннектились к ноосфере, но результат налицо. Почему с благодарностью не воспользоваться готовыми результатами вместо того, чтобы изобретать велосипед. В результате я написал следующее консольное приложение, которое обшаривает заданный фолдер и вытаскивает для каждого его файла и подфолдера эксплорерные свойства.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

using System.Diagnostics;

namespace ConsoleApplication1

{

    class Program

    {

        static void Main(string[] args)

        {

            Shell32.ShellClass shell = new Shell32.ShellClass();

            Shell32.Folder folder = shell.NameSpace("c:\\demo");

            //Поля

            for (int i = 0; i < 268; i++) Debug.Write(String.Format("{0}.{1}; ", i, folder.GetDetailsOf(null, i)));

            //Можно хоть до бесконечности, ошибки не будет, просто вместо названий свойств начнутся пустоты

            Debug.WriteLine("");

            //Значения

            foreach (Shell32.FolderItem fi in folder.Items())

            {

                Debug.WriteLine(String.Format("{0} {1}", fi.Path, fi.Name));

                for (int i = 0; i < 268; i++) Debug.Write(String.Format("{0}.{1}; ", i, folder.GetDetailsOf(fi, i)));

                Debug.WriteLine("");

            }

        }

    }

}

Скрипт 1

Единственно, в References к проекту требуется добавить СОМовскую библиотеку %windir%\System32\SHELL32.dll:

image003

рис.2