MS Office ファイルのみに指定されたカスタム プロパティを持つ.docx
ファイルがあります。
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
ますか?