Свойства файла (версия, ширина/высота изображения и т.д.)

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

Была необходимость получить информацию о размерах изображения средствами 1С. Поиск в интеренете дал несколько вариантов, как с использованием внешних библиотек, так и без них. Один из таких вариантов мне понравился больше всего, но имел небольшой недостаток — на разных версиях Windows давал различные результаты. Я попытался все это обобщить и написал утилитку которой и пользуюсь сейчас. Надеюсь Вам пригодится. 

 

Перем СписокСвойствФайла, WshShell, objShellApp; // Храним для сокращения времени обработки нескольких файлов подряд

// Выделяет подстроку по разделителю
// В стандартных конфигурациях 1С имеется подобная функция, добавил сюда только для универсальности
Функция Выделить(Стр, Разд=";")
Поз = Найти(Стр, Разд);
Если Поз = 0 Тогда
Рез = Стр;
Стр = "";
Иначе
Рез = Лев(Стр, Поз - 1);
Стр = Сред(Стр, Поз + СтрДлина(Разд));
КонецЕсли;
Возврат Рез;
КонецФункции

// Удаляет из строки спецсимволы юникода и преобразует строку в число
Функция ЗначениеВЧисло(Знач Зн)
Пока Зн <> "" Цикл
Если Найти("0123456789", Лев(Зн, 1)) = 0 Тогда
Зн = Сред(Зн, 2);
ИначеЕсли Найти("0123456789", Прав(Зн, 1)) = 0 Тогда
Зн = Лев(Зн, СтрДлина(Зн) - 1);
Иначе
Прервать;
КонецЕсли;
КонецЦикла;
Возврат ?(Зн="", 0, Число(Зн));
КонецФункции

// Возвращает объект Соответствие со списком всех ненулевых свойств файла или Неопределено - если свойства определить не получилось
// СписокСвойств - может содержать список необходимых свойств, разделенных точкой с запятой ";"
// Если указано всего одно свойство, то будет возвращено полученное значение, а не список значений!
// Например: ПолучитьСведенияОФайле("c:windows
otepad.exe", "Версия продукта");
Функция ПолучитьСведенияОФайле(ПутьДоФайла, Знач СписокСвойств = Неопределено)
Файл = Новый Файл(ПутьДоФайла);
Если Файл.Существует() Тогда
Если WshShell = Неопределено Тогда
WshShell     = Новый COMОбъект("WScript.Shell");
objShellApp   = Новый COMОбъект("Shell.Application");
КонецЕсли;
objFolder    = objShellApp.NameSpace(Файл.Путь);
objItem     = objFolder.ParseName(Файл.Имя);
Рез      = Новый Соответствие;
Если СписокСвойствФайла = Неопределено Тогда
СписокСвойствФайла = Новый Соответствие;
Для К=0 По 300 Цикл
ИмяСвойства  = СокрЛП(objFolder.GetDetailsOf(NULL, К));
Если ИмяСвойства <> "" Тогда
СписокСвойствФайла.Вставить(ИмяСвойства, К);
Если СписокСвойств = Неопределено Тогда
Значение = objFolder.GetDetailsOf(objItem,К);
Если Значение <> "" Тогда
Рез.Вставить(ИмяСвойства, Значение);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если СписокСвойств = Неопределено Тогда
Возврат Рез;
КонецЕсли;
КонецЕсли;
Если СписокСвойств = Неопределено Тогда
Для Каждого Эл Из СписокСвойствФайла Цикл
Значение = objFolder.GetDetailsOf(objItem, Эл.Значение);
Если Значение <> "" Тогда
Рез.Вставить(Эл.Ключ, Значение);
КонецЕсли;
КонецЦикла;
Иначе
Пока СписокСвойств<>"" Цикл
Имя = Выделить(СписокСвойств);
Поз = СписокСвойствФайла.Получить(Имя);
Значение = ?(Поз = Неопределено, Неопределено, objFolder.GetDetailsOf(objItem, Поз));
Если СписокСвойств = "" И Рез.Количество() = 0 Тогда
Возврат Значение;
КонецЕсли;
Рез.Вставить(Имя, Значение);
КонецЦикла;
КонецЕсли;
Возврат ?(Рез.Количество()=0, Неопределено, Рез);
КонецЕсли;
Возврат Неопределено;
КонецФункции

// В качестве примера, получение размеров изображения
Функция ПолучитьРазмерыИзображения(ПутьДоФайла)
Рез = Новый Структура("Высота,Ширина", 0, 0);
Зн = ПолучитьСведенияОФайле(ПутьДоФайла, "Размеры");
Если Зн <> Неопределено Тогда
Рез.Ширина = ЗначениеВЧисло(СокрЛП(Выделить(Зн, "x")));
Рез.Высота = ЗначениеВЧисло(СокрЛП(Зн));
КонецЕсли;
Возврат Рез;
КонецФункции

1 Comment

  1. user1280267

    Спасибо большое!

    Все работает замечательно)

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *