如何设置扩展文件属性?

时间:2011-03-17 10:16:21

标签: c#

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

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

我发现了一些关于taglib-sharp的内容,它似乎有一个设置扩展属性的选项,但我真的不明白它是如何工作的。

5 个答案:

答案 0 :(得分:47)

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。你不能 修改其AuthorTitle媒体资源。
  • 用Word打开它,编辑并保存 它。现在你可以。

因此,请务必使用一些try catch

进一步的主题: MSDN: Implementing Property Handlers

答案 1 :(得分:24)

好的,这是我自己的问题的答案,因为我在这个论坛上找不到我的答案,它可能对其他人有用。 解决方案是使用dsofile.dll和OleDocumentPropertiesClass。 这是关于dsofile.dll的MS文章 - Link 在此链接中,您可以下载dsofile.dll以及其他一些文件。但最有可能的是,就像我一样,你将面临一些难以找到解决方案的奇怪问题。

1)在输入dsofile.dll之后,您需要注册类:oped cmd并导航到目录的c:\ dsofile,在那里您已经解压缩了下载的dsofile.dll。之后 - 写行 regsvr32 dsofile.dll 。你应该得到一个消息框说注册成功。如果没有,最可能的是你没有管理员权限。如果您希望这样做,您将需要管理员权限。

2)在您的程序中尝试使用此类之后,如果您使用的是.NET 4.0,则可能会看到错误,例如“class无法嵌入...” 那么,为此,右键单击引用列表中的dsofile,属性 - >嵌入互操作文件 - >设置为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();

答案 2 :(得分:7)

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

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

您需要的是可以自动修改PDF文件的库或工具。您可以尝试google pdf sdk。如果您还需要使用Word文件,则可以使用COM自动化来自动化Word。根据所使用的Word文件格式,您也可以直接使用该文件而无需安装Word(XML比旧的二进制“流”格式更容易)。

答案 3 :(得分:2)

谢谢@andree,我已经搜索了很多答案.. (对我来说,它只适用于.doc文件)。 加入

 -V     Available for qsub, qsh, qrsh with command and qalter.

        Specifies that all environment variables active within the qsub utility be exported to the context of the job.

        All environment variables specified with -v, -V or the DISPLAY variable provided with -display will be exported to the defined JSV  instances  only  optionally  when  this  is
        requested explicitly during the job submission verification.  (see -jsv option above or find more information concerning JSV in jsv(1))

只是检查Ole文件..

以Visual Studio身份管理员

答案 4 :(得分:1)

要设置属性,您可以使用Windows' Property System.它提供了一个用于访问"属性存储缓存的接口" (IPropertyStore)您可以在其中读取/设置任何文件的属性(无论格式如何),并添加您自己的自定义属性(c库propkey.h具有所有可用属性的完整列表;您也可以找到这些属性使用prop.exe)。这实质上是创建一个属性处理程序,必须稍后注册到您的文件扩展名。它在托管代码中是正式不受支持的,因此您可能要么编写自己的包装器或使用c ++(因为这是一个带有c#标记的问题)。

如果您特别要求媒体属性,请查看元数据处理程序,这些处理程序本质上是从文件中提取属性的编解码器,如果您正确注册它们,默认情况下也会由资源管理器调用。