Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Однажды я по ошибке открыл вместо 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