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

29.07.13

Разработка - Универсальные функции

Получение дополнительной информации о файле средствами 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")));
		Рез.Высота = ЗначениеВЧисло(СокрЛП(Зн));
	КонецЕсли;
	Возврат Рез;
КонецФункции

Вступайте в нашу телеграмм-группу Инфостарт

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    4983    Abysswalker    11    

47

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    9309    DeerCven    15    

63

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    58969    dimanich70    85    

175

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    8237    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    73988    atdonya    31    

73

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    10225    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. user1280267 13.09.19 16:00 Сейчас в теме
Спасибо большое!
Все работает замечательно)
2. va582 13.09.20 01:26 Сейчас в теме
Просто на заметку)

Скрытый текст
3. va582 13.09.20 01:31 Сейчас в теме
(2) Можно получить после прохода цикла

Файл = new file("C:\Users\"); // 
Shell = new comobject("Shell.Application");
shellFolder = Shell.Namespace(Файл.Путь);
for i = -1 to 400 do
	message(string(i) + chars.tab + shellFolder.GetDetailsOf(null, i));
enddo;


Походу максимум 312 ) дальше уже нет смысла.
Для отправки сообщения требуется регистрация/авторизация