我想编写一段简单的代码,它只从目录中存在的一组office(docx,pptx等)文件中提取标记信息,以便可以轻松地对其进行索引和搜索。 / p>
当我说“tag”时,我指的是自Vista以来你能够添加到文件中的标签信息。它通常使用Explorer完成。例如,下面屏幕截图中的pptx文件附有标签“bubble”。
但是,搜索这些标签已经内置到Windows中,你说呢?为什么,是的,但我需要这个只对索引进行索引,我需要通过Intranet而不是在Windows内部公开信息。
我发现在office文件包中,实际信息存储在cp:keywords元素的/docProps/core.xml文件中。我确实意识到,在代码中,我可以解压缩文件,访问该文件,并提取我需要的内容。不过,我希望那里有一个预先抽象的解决方案。我非常怀疑Windows正在做什么来索引相同的信息(但不可否认,我真的找不到任何好的信息)。
我也发现了一些关于IFilters的讨论。然而,这会访问文件的文本。我没有看到IFilter在哪里帮助解决这个特殊问题。
有人能指出我在这个方向上正确的方向吗?
答案 0 :(得分:1)
我没有安装单词,但我猜他们可以从标准属性系统访问它们作为KEYWORD条目和jpg图片上的标签。
如果您想知道它是如何完成的,我使用shell COM API,这里是Gist中的完整示例代码:FileTags.cs。但这只是为了好玩,你应该使用Microsoft Windows API Code Pack,因为它们的实现更加清晰。
要获取标记(在内部称为关键字),请参考Microsoft.WindowsAPICodePack.Shell.dll
,然后:
using System;
using Microsoft.WindowsAPICodePack.Shell;
class Program
{
static void Main()
{
var shellFile = ShellFile.FromFilePath(@"C:\path\to\some\file.jpg");
var tags = (string[])shellFile.Properties.System.Keywords.ValueAsObject;
tags = tags ?? new string[0];
Console.WriteLine("Tags: {0}", String.Join("; ", tags));
Console.ReadLine();
}
}
如果他们没有搞砸它应该从 Windows XP SP2 开始工作( Mine应该从SP1开始工作,因为我避开了PropVariantGetStringElem但是没有它们真的很烦人 )。