如何设置扩展文件属性?

我需要为某些Word / PDF文档设置公司字段值。 我正在讨论在文件属性下看到的扩展文件属性(摘要/作者/标题等)。

我知道如何他们(通过使用shell32.dll类库)。 我认为我也可以它们设置为相同的类库,但似乎编写扩展属性有点困难, shell32.dll不允许这样做。

我发现了一些关于taglib-sharp东西,它似乎可以设置扩展属性,但是我不太了解它是如何工作的。

好的,这里是回答我自己的问题,因为我没有真正能够在这个论坛上find我的答案,这可能对其他人有用。 解决方法是使用dsofile.dll和OleDocumentPropertiesClass。 这里是MS文章关于dsofile.dll – 链接在这个链接,您可以下载dsofile.dll与其他文件。 但最有可能的是,就像我一样,你将面临一些难以find解决scheme的奇怪问题。

1)安装完dsofile.dll之后,需要注册类:oped cmd并导航到目录的c:\ dsofile目录,在这里你已经解压下载了dsofile.dll。 之后 – 写行regsvr32 dsofile.dll 。 你应该得到一个消息框,说注册是成功的。 如果没有,最有可能的是你没有pipe理员权限。 如果你想要这个工作,你将需要pipe理员权限。

2)在你的程序中试图使用这个类之后,如果你正在使用.NET 4.0,你可能会看到类似“class can not be embedded …”这样的错误,为此,右键单击dsofile引用列表,属性 – >embedded互操作文件 – >设置为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(); 

解决scheme2016

将以下NuGet包添加到您的项目中:

  • Microsoft.WindowsAPICodePack-Shell
  • Microsoft.WindowsAPICodePack-Core

读取和写入属性

 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(); 

重要:

该文件必须是由特定分配的软件创build的有效文件。 每种文件types都有特定的扩展文件属性,而不是全部都是可写的。

如果在桌面上右键单击某个文件并且无法编辑属性,则无法在代码中编辑该文件。

例:

  • 在桌面上创buildtxt文件,将其扩展名重命名为docx。 您不能编辑其AuthorTitle属性。
  • 用Word打开它,编辑并保存它。 现在你可以。

所以只要确保使用一些try catch

进一步的主题: MSDN:实现属性处理程序

Windows资源pipe理器(使用shell32.dll )能够显示扩展的属性,因为它理解许多不同的文件格式,并可以parsing这些。 但是,要设置扩展属性,您可能需要特定于文件格式的库。 例如设置一个MP3文件的作者与设置一个Office文档的作者相比是非常不同的。 (其实Windows资源pipe理器允许您在Office文档上设置一些扩展属性。)

taglib-sharp仅适用于媒体文件,很可能无法设置任何其他types文件的扩展属性。

你需要的是一个库或一个工具,你可以自动修改PDF文件。 你可以尝试谷歌PDF SDK 。 如果您还需要使用Word文件,则可以使用COM自动化来自动化Word。 根据所使用的Word文件格式,您也可以在不安装Word的情况下直接使用该文件(XML比旧的二进制“stream”格式要容易得多)。

感谢@andree,我search了很多答案..(对我来说,它只适用于.doc文件)。 添加

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

只是为了检查如果Ole文件..

和Visual Studio作为pipe理员

要设置属性,你可以利用Windows的财产系统。 它提供了一个访问“属性存储caching”(IPropertyStore)的接口,您可以在其中读取/设置任何文件的属性(不pipe格式),并添加自己的自定义属性(C库propkey.h有一个全面的列表可用的属性;你也可以使用prop.exefind这些)。 这基本上是创build一个属性处理程序,必须稍后注册到您的文件扩展名。 它在托pipe代码中是官方不支持的,所以你可能要编写自己的包装器或使用c ++(因为这是ac#标记的问题)。

如果您特别要求媒体属性,请检查元数据处理程序,这些元数据处理程序本质上是编解码器,可以从文件中提取属性,如果您正确注册,也可以由资源pipe理器默认调用。