#c_sharp #файлы
Здравствуйте. Подскажите, как можно посмотреть свойства файла на подобии тех, что появляются в окошке, когда жмешь правой кнопкой мыши по файлу, выбираешь там строчку "свойства" и потом появляется то самое окошко? Сейчас я использую FileVersionInfo.GetVersionInfo, но конечный результат, мягко говоря, меня не радует - практически все свойства пустые (см. скриншот). Свойства менять не надо, только прочитать и вывести, допустим, в текстовые поля. Язык C#. Работаю, если что, с торрент-файлами.
Ответы
Ответ 1
Это всё умеет 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\notepad.exe Тип: Приложение Язык: Русский (Россия) Состояние ссылки: Неразрешенные Состояние общего доступа: Общий доступ отсутствует Название продукта: Операционная система Microsoft® Windows® Версия продукта: 10.0.16299.15Ответ 2
В целом для каждого формата файлов все будет по своему (ID3-теги у mp3, и другие форматы метаинформации для прочих медиафайлов нужно будет читать и парсить индивидуально), общую же информацию о файле можно получать используя класс System.IO.FileInfo.
Комментариев нет:
Отправить комментарий