Как установить расширенные свойства файла?

Мне нужно установить значение поля Company для некоторых документов Word/PDF. Я говорю о расширенных свойствах файла (резюме/автор/название и т.д.), Которые вы видите в разделе "Свойства файла".

Я знаю, как их получить (используя библиотеку классов shell32.dll). Я предположил, что я мог бы также установить их с той же библиотекой классов, но кажется, что писать расширенные свойства немного сложнее, а shell32.dll не позволяет этого.

Я нашел что-то о taglib-sharp, у которого есть возможность установить расширенные свойства, но я действительно не понимаю, как это работает.

Ответ 1

Решение 2016

Добавьте в проект следующие пакеты NuGet:

  • Microsoft.WindowsAPICodePack-Shell от Microsoft
  • Microsoft.WindowsAPICodePack-Core от Microsoft

Чтение и запись свойств

using Microsoft.WindowsAPICodePack.Shell;
using Microsoft.WindowsAPICodePack.Shell.PropertySystem;

string filePath = @"C:\temp\example.docx";
var file = ShellFile.FromFilePath(filePath);

// Read and Write:

string[] oldAuthors = file.Properties.System.Author.Value;
string oldTitle = file.Properties.System.Title.Value;

file.Properties.System.Author.Value = new string[] { "Author #1", "Author #2" };
file.Properties.System.Title.Value = "Example Title";

// Alternate way to Write:

ShellPropertyWriter propertyWriter =  file.Properties.GetPropertyWriter();
propertyWriter.WriteProperty(SystemProperties.System.Author, new string[] { "Author" });
propertyWriter.Close();

Важно:

Файл должен быть действительным, созданным определенным назначенным программным обеспечением. Каждый тип файла имеет определенные расширенные свойства файла, и не все из них доступны для записи.

Если вы щелкните правой кнопкой мыши файл на рабочем столе и не можете редактировать свойство, вы также не сможете его редактировать в коде.

Пример:

  • Создайте txt файл на рабочем столе, переименуйте его расширение в docx. Вы не можете отредактируйте его свойство Author или Title.
  • Откройте его с помощью Word, отредактируйте и сохраните Это. Теперь вы можете.

Поэтому просто используйте несколько try catch

Дополнительная тема: MSDN: реализация обработчиков свойств

Ответ 2

Хорошо, вот ответ на мой вопрос, так как я действительно не мог найти свой ответ на этом форуме, он может быть полезен другим. Решение заключается в использовании dsofile.dll и OleDocumentPropertiesClass. Вот статья MS о dsofile.dll - Ссылка В этой ссылке вы можете скачать dsofile.dll с некоторыми другими файлами. Но, скорее всего, как и я, вы столкнетесь с некоторыми странными проблемами, которые трудно найти для решения.

1) После intalling dsofile.dll вам нужно будет зарегистрировать класс: oped cmd и перейти в каталог c:\dsofile в каталог, где вы извлекли загруженный файл dsofile.dll. После этого - напишите строку regsvr32 dsofile.dll. Вы должны получить сообщение с сообщением о том, что регистрация прошла успешно. Если нет, большинство из них, возможно, не имеют прав администратора. Вам понадобятся права администратора, если вы хотите, чтобы это работало.

2) После попытки использовать этот класс в вашей программе, если вы используете .NET 4.0, возможно, что вы увидите ошибку, говорящую о том, что "класс не может быть встроен..." Ну, для этого щелкните правой кнопкой мыши на dsofile в списке ссылок, свойства → вставить файлы interop → установите в FALSE.

3) Как использовать:

    //creates new class of oledocumentproperties
    var doc = new OleDocumentPropertiesClass();

    //open your selected file
    doc.Open(pathToFile, false, dsoFileOpenOptions.dsoOptionDefault);

    //you can set properties with summaryproperties.nameOfProperty = value; for example
    doc.SummaryProperties.Company = "lol";
    doc.SummaryProperties.Author = "me";

    //after making changes, you need to use this line to save them
    doc.Save();

Ответ 3

Проводник Windows (с помощью shell32.dll) способен отображать расширенные свойства, поскольку он понимает множество разных форматов файлов и может их анализировать. Однако для установки расширенного свойства вам, вероятно, нужна специальная библиотека формата файла. Например. для установки автора файла MP3 файла очень отличается по сравнению с установкой автора документа Office. (Фактически Windows Explorer позволяет установить некоторые расширенные свойства в документах Office.)

Taglib-sharp работает только с медиа файлами и, скорее всего, не сможет устанавливать расширенные свойства любого другого типа файлов.

Вам нужна библиотека или инструмент, который вы можете автоматизировать для изменения файлов PDF. Вы можете попробовать google pdf sdk. Если вам также необходимо работать с файлами Word, вы можете использовать автоматизацию COM для автоматизации Word. В зависимости от используемого формата файла Word вы также можете работать непосредственно с файлом без установки Word (XML намного проще, чем старый двоичный "поток" ).

Ответ 4

Спасибо @andree, я много искал ответы. (Для меня это работало только с .doc файлами). Добавлен

if (!doc.IsOleFile)
    Console.ReadLine();

Просто проверьте, есть ли файл Ole..

И Visual Studio как администратор

Ответ 5

Чтобы установить свойства, вы можете использовать Систему свойств Windows. Он предоставляет интерфейс для доступа к "Кэш-хранилище свойств" (IPropertyStore), где вы можете читать/устанавливать любые свойства файла (независимо от формата) и добавлять свои собственные пользовательские свойства (библиотека c propkey.h имеет полный список всех доступных свойств, вы также можете найти их с помощью prop.exe). Это по существу создает Обработчик свойств, который должен быть позже зарегистрирован в вашем расширении файла. Он официально не поддерживается в управляемом коде, поэтому вы можете либо написать собственный обертку, либо использовать С++ (так как это вопрос с тегом С#).

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