我的.docx
文件具有仅为 MS Office 文件指定的自定义属性。
如果我尝试在没有安装 MS Office 的情况下在计算机中打开相同的文件,则文件详细信息选项卡中没有标签属性。
我需要阅读Tags
我的 c# 代码。
我尝试了这个解决方案并将索引检索Tags
为18
. 然后我使用了下一个代码:
public class TagsReader : ITagsReader
{
private const int keywordsIndex = 18;
public string Read(string filePath)
{
var fullPath = Path.GetFullPath(filePath);
var directoryName = Path.GetDirectoryName(fullPath);
Folder dir = GetShell32Folder(directoryName);
var fileName = Path.GetFileName(fullPath);
FolderItem item = dir.ParseName(fileName);
return dir.GetDetailsOf(item, keywordsIndex);
}
private Folder GetShell32Folder(string folderPath)
{
var shellAppType = Type.GetTypeFromProgID("Shell.Application");
var shell = Activator.CreateInstance(shellAppType);
return (Folder)shellAppType.InvokeMember("NameSpace",
BindingFlags.InvokeMethod, null, shell, new object[] { folderPath });
}
}
但它不适用于未安装 MS Office 的计算机。它仅适用于.doc
文件,但不适用于.docx
. 现在我使用Interop
了不稳定、资源密集型并且需要将 MS Office 安装到服务器的基于解决方案:
public class WordTagsReader : ITagsReader
{
private readonly string[] availableFileExtensions = { ".docx" };
public string Read(string filePath)
{
var fileExtension = Path.GetExtension(filePath);
if (!availableFileExtensions.Contains(fileExtension))
return null;
dynamic application = null;
dynamic document = null;
var tags = string.Empty;
try
{
var typeWord = Type.GetTypeFromProgID("Word.Application");
application = Activator.CreateInstance(typeWord);
application.Visible = false;
application.DisplayAlerts = false;
var fullFilePath = Path.GetFullPath(filePath);
document = application.Documents.Open(fullFilePath);
tags = document.BuiltInDocumentProperties["Keywords"].Value;
}
finally
{
if (document != null)
{
document.Close();
document = null;
}
if (application != null)
{
application.Quit();
application = null;
}
}
return tags;
}
}
此代码可能会不时崩溃并留下正在运行的 MS Word 实例,该实例占用资源并阻止文件。我有许多处理程序同时工作,然后我无法将“左”实例与正常工作和清洁的资源分开。
这就是寻找替代解决方案的原因。有没有办法在Tags
不使用的情况下读取特定(自定义)属性Office.Interop
?