Страницы

Поиск по вопросам

вторник, 2 апреля 2019 г.

Свойства файла как в windows C#

Здравствуйте. Подскажите, как можно посмотреть свойства файла на подобии тех, что появляются в окошке, когда жмешь правой кнопкой мыши по файлу, выбираешь там строчку "свойства" и потом появляется то самое окошко?
Сейчас я использую FileVersionInfo.GetVersionInfo, но конечный результат, мягко говоря, меня не радует - практически все свойства пустые (см. скриншот). Свойства менять не надо, только прочитать и вывести, допустим, в текстовые поля. Язык C#. Работаю, если что, с торрент-файлами.


Ответ

Это всё умеет Windows Shell, поэтому не будем изобретать велосипед, а спросим у неё. Нам понадобится подключить в References COM-объект Shell32 (он называется «Microsoft Shell Controls And Automation»):

После этого пишем следующий код:
[STAThread] // нужно для консольных приложений, иначе COM не будет работать static void Main(string[] args) { var path = @"D:\IMG_2111.JPG"; // к примеру var dir = Path.GetDirectoryName(path); var file = Path.GetFileName(path);
var shell = new Shell32.Shell(); var folder = shell.NameSpace(dir); var folderItem = folder.ParseName(file);
var names = (from idx in Enumerable.Range(0, short.MaxValue) let key = folder.GetDetailsOf(null, idx) where !string.IsNullOrEmpty(key) select (idx, key)).ToDictionary(p => p.idx, p => p.key);
var properties = (from idx in names.Keys orderby idx let value = folder.GetDetailsOf(folderItem, idx) where !string.IsNullOrEmpty(value) select (name: names[idx], value)).ToList();
foreach (var kvp in properties) Console.WriteLine($"{kvp.name}: {kvp.value}"); }
Если не хочется подключать COM-объект статически, через References, вы можете подключить его в рантайме:
var shellAppType = Type.GetTypeFromProgID("Shell.Application"); dynamic shell = Activator.CreateInstance(shellAppType); var folder = shell.NameSpace(dir); var folderItem = folder.ParseName(file);
var names = (from idx in Enumerable.Range(0, short.MaxValue) let key = (string)folder.GetDetailsOf(null, idx) // пришлось вставить cast where !string.IsNullOrEmpty(key) select (idx, key)).ToDictionary(p => p.idx, p => p.key);
var properties = (from idx in names.Keys orderby idx let value = (string)folder.GetDetailsOf(folderItem, idx) // пришлось вставить cast where !string.IsNullOrEmpty(value) select (name: names[idx], value)).ToList();
(Ещё можно описать интерфейсы через [ComImport] [InterfaceType(...)], чтобы не работать через dynamic, но мне лень.)
У меня получился такой вот результат. Для картинки:
Имени: IMG_2111.JPG Размера: 1,22 МБ Тип элемента: JPG Image Дата изменения: 03.02.2018 15:12 Дата создания: 03.02.2018 15:12 Дата доступа: 03.02.2018 15:12 Атрибуты: A Распознанный тип: Изображение Владелец: Hive\VladD Вид: Изображение Дата съемки: ‎22.‎08.‎2016 ‏‎15:19 Оценка: Без оценки Камера, модель: iPhone 6s Размеры: ‪2576 x 1920‬ Камера, изготовитель: Apple Имя программы: 9.3.4 Компьютер: HIVE (этот компьютер) Расширение: .JPG Имя файла: IMG_2111.JPG Глубина цвета: 24 Горизонтальное разрешение: ‎72 точек на дюйм Ширина: ‎2576 пикселей Разрешение по вертикали: ‎72 точек на дюйм Высота: ‎1920 пикселей Общий доступ: Нет Имя папки: D:\ Путь к папке: D:\ Расположение: D:\ Путь: D:\IMG_2111.JPG Тип: JPG Image Состояние ссылки: Неразрешенные Версия EXIF: 0221 Экспокоррекция: ‎0 шаг. Программа экспозиции: Обычный Выдержка: ‎1/444 с. Диафрагма: f/2.2 Вспышка, режим: Без вспышки, принудительно Фокусное расстояние: ‎3 мм Фокусное расстояние, экв. 35 мм: 31 Скорость ISO: ISO-32 Экспозамер: Усредненный Ориентация: Обычный Программный режим: Обычная съемка Баланс белого: Авто Состояние общего доступа: Общий доступ отсутствует
Для исполнимого файла:
Имени: notepad.exe Размера: 231 КБ Тип элемента: Приложение Дата изменения: 29.09.2017 15:42 Дата создания: 29.09.2017 15:42 Дата доступа: 29.09.2017 15:42 Атрибуты: A Распознанный тип: Приложение Владелец: TrustedInstaller Вид: Программа Оценка: Без оценки Авторские права: © Корпорация Майкрософт. Все права защищены. Организация: Microsoft Corporation Описание файла: Блокнот Компьютер: HIVE (этот компьютер) Расширение: .exe Имя файла: notepad.exe Версия файла: 6.2.16299.15 Общий доступ: Нет Имя папки: System32 Путь к папке: C:\Windows\System32 Расположение: System32 (C:\Windows) Путь: C:\Windows\System32
otepad.exe Тип: Приложение Язык: Русский (Россия) Состояние ссылки: Неразрешенные Состояние общего доступа: Общий доступ отсутствует Название продукта: Операционная система Microsoft® Windows® Версия продукта: 10.0.16299.15

Комментариев нет:

Отправить комментарий