Расширенные свойства файлов
Однажды я по ошибке открыл вместо SSMS Windows Explorer. Это ж сколько на свете бывает фолдеров и файлов, обалдеть просто. А свойств-то, свойств у них сколько!
рис.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:
рис.2
Comments
Anonymous
June 14, 2009
Следующим логичным стремлением было превратить " Расширенные свойства файлов "Скрипт 1 в хранимую процедуруAnonymous
June 14, 2009
PingBack from http://tune-up-pc.com/blog/?p=2357