如何设置扩展文件属性?

Posted

技术标签:

【中文标题】如何设置扩展文件属性?【英文标题】:How to set extended file properties? 【发布时间】:2011-03-17 10:16:21 【问题描述】:

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

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

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

【问题讨论】:

我怀疑对于简单文件,它们位于备用 NTFS 流中,e.g. this one 但对于 .docs,它们实际上是 doc 文件本身的属性。我认为 taglib-sharp 仅适用于 mp3 文件。 Explorer 可能使用了一个 COM 对象来解析这些您可以自动化的对象? 我检查了 tablib,它仅适用于 mp3。也许给我一个关于 COM 对象的线索,因为我不太明白。我是一个初学者,似乎我正在努力解决一些问题。 @andree - 感谢您分享您的答案。我正在从事类似的任务,并且确实发现使用 Shell32.dll 我可以获得属性但无法设置它们。你的回答对我很有帮助。 这能回答你的问题吗? Read/Write 'Extended' file properties (C#) 【参考方案1】:

将以下 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();

重要:

该文件必须是由特定分配的软件创建的有效文件。每种文件类型都有特定的扩展文件属性,并非所有文件都是可写的。

如果您右键单击桌面上的文件并且无法编辑属性,您也无法在代码中对其进行编辑。

例子:

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

所以请确保使用一些 try catch

进一步的话题: MS Docs: Implementing Property Handlers

【讨论】:

这个答案需要更多 +1。不能让它在底部徘徊。它不仅是 OP 的最佳答案,而且 WindowsAPICodePack 也很棒。 我可以添加我的自定义属性吗? 因此属性(及其读/写能力)必须由文件扩展名的定义确定。如果是这样,那么这是在哪里? 出于某种原因,ShellPropertyWriter 似乎偶尔不会保存更改。直接更改值 as shown in this answer 似乎对我来说效果更好。 你能推荐一个 .net 核心解决方案吗?【参考方案2】:

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

1) 安装 dsofile.dll 后,您需要注册类:操作 cmd 并导航到您已提取下载的 dsofile.dll 的目录的 c:\dsofile。之后 - 写 regsvr32 dsofile.dll 行。您应该会收到一个消息框,说明注册成功。如果没有,很可能您没有管理员权限。如果你想让它工作,你将需要管理员权限。

2) 在您的程序中尝试使用此类后,如果您使用的是 .NET 4.0,您可能会看到类似 "class cannot be embedded ..." 的错误信息 好吧,为此,右键单击引用列表中的 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();

【讨论】:

还有 1 个可能的问题 - 尝试编写使用 64 位 office 创建的文档时。 我有办公室 64 位,它工作得很好。到目前为止,我还没有遇到任何问题。如果您不介意,您正在运行哪个 Office 版本?我有家庭和学生 这仅适用于 MS Word 文件吗?仅 MS Office 文件?您在问题中提到的 PDF 文件呢? 如果我没记错的话 - 这仅适用于 Office 文件。对于 PDF,还有其他提供此功能的库。 @johnywhy 现在这里是公认且评价最高的答案:***.com/a/37987288/3546415(“MA-Maddin”改名为“Martin Schneider”)【参考方案3】:

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

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

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

【讨论】:

但是,如果它理解文件格式本身,我会感到非常惊讶 - 我希望在 HKCU 下会有一些文件扩展名或文件数据,它引用了命名实现的 COM 对象一个通用接口并进行解析,以便第三方可以编写自己的并扩展支持的文件类型集。 (但我找不到这个。)但是,是的,只是获得修改 PDF 和 DOC 的工具可能更容易。【参考方案4】:

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

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

【讨论】:

以上是关于如何设置扩展文件属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Mac OS X 中删除文件的“扩展属性”?

windows服务器设置文件属性设置去掉隐藏已知文件类型的扩展名(即文件后缀名可见)

如何读取扩展文件属性/文件元数据

如何在扩展属性中保存二进制文件?

如何使用 python 获取文件的扩展 MacOS 属性?

如何使用PHP更改文件的Title属性