gifts2017

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

Опубликовал Sergey (zsrg) в раздел Программирование - Инструментарий

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

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

 

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

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

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

// Возвращает объект Соответствие со списком всех ненулевых свойств файла или Неопределено - если свойства определить не получилось
// СписокСвойств - может содержать список необходимых свойств, разделенных точкой с запятой ";"
// Если указано всего одно свойство, то будет возвращено полученное значение, а не список значений!
// Например: ПолучитьСведенияОФайле("c:\windows\notepad.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")));
		Рез.Высота = ЗначениеВЧисло(СокрЛП(Зн));
	КонецЕсли;
	Возврат Рез;
КонецФункции

См. также

Подписаться Добавить вознаграждение
В этой теме еще нет сообщений.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа