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

170
05 февраля 2018, 02:49

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

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

Answer 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
Answer 2

В целом для каждого формата файлов все будет по своему (ID3-теги у mp3, и другие форматы метаинформации для прочих медиафайлов нужно будет читать и парсить индивидуально), общую же информацию о файле можно получать используя класс System.IO.FileInfo.

READ ALSO
Рисовать в пропорции к PictureBox

Рисовать в пропорции к PictureBox

РисуюImage на PictureBox, я сделал возможность лепить Image пользователю на PictureBox самому, чтобы он выбирал место (X, Y) где хочет

181
Рисование в UWP

Рисование в UWP

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

160
NullPointerException в while(!=null) IEnumerator

NullPointerException в while(!=null) IEnumerator

Решил сделать реализацию LinkedList, используя IEnumerableПроблема как раз-таки в нем

174
Task<T> вернуть null, не прерывая задачу

Task<T> вернуть null, не прерывая задачу

Одна задача, ожидает выполнение другой задачи, как только возвращаем null из ожидаемой задачи, происходит прерывание выполнения другой

177