Здравствуйте. Подскажите, как можно посмотреть свойства файла на подобии тех, что появляются в окошке, когда жмешь правой кнопкой мыши по файлу, выбираешь там строчку "свойства" и потом появляется то самое окошко?
Сейчас я использую 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\notepad.exe
Тип: Приложение
Язык: Русский (Россия)
Состояние ссылки: Неразрешенные
Состояние общего доступа: Общий доступ отсутствует
Название продукта: Операционная система Microsoft® Windows®
Версия продукта: 10.0.16299.15
В целом для каждого формата файлов все будет по своему (ID3-теги у mp3, и другие форматы метаинформации для прочих медиафайлов нужно будет читать и парсить индивидуально), общую же информацию о файле можно получать используя класс System.IO.FileInfo
.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
РисуюImage на PictureBox, я сделал возможность лепить Image пользователю на PictureBox самому, чтобы он выбирал место (X, Y) где хочет
Столкнулся с проблемой рисования в UWPПо задумке, на странице будет область, где можно располагать заранее нарисованные фигуры, которые были...
Решил сделать реализацию LinkedList, используя IEnumerableПроблема как раз-таки в нем
Одна задача, ожидает выполнение другой задачи, как только возвращаем null из ожидаемой задачи, происходит прерывание выполнения другой