本周我在应用于 TIFF/TIF 文件时遇到了一个关于 Windows Shell 属性系统的问题。我正在使用Microsoft.WindowsAPICodePack 1.1.0.0 访问属性系统。
添加属性时,文件会损坏,因为它似乎存储在预期的第一个 IFD 指针的位置。现在我不确定它是否只是在文件头(0x49 0x49 0x2A 0x00)之后的第 5 个字节插入自身,是否会覆盖任何现有数据。此外,在比较 IDF 条目标头的十六进制时,字节看起来不同。现在,当我说损坏时,它只是在以编程方式将文件作为字节流打开时,不知道文件是否添加了属性系统容器。它在 Windows Image Preview 中可以正常打开,但不能在我的客户用来查看 TIFF 文件的软件中打开。
这是我添加属性的方式(作为 key=value 字符串的数组)。
public void SetFileTag(string fileName, string tagName, string tagValue)
{
try
{
using (var shellFile = ShellFile.FromFilePath(fileName))
{
var keywords = shellFile.Properties.System.Keywords.Value;
var keyValue = string.Concat(tagName, "=", tagValue);
var list = keywords == null ? new List<string>() : new List<string>(keywords);
if (list.Contains(keyValue))
{
return;
}
list.Add(keyValue);
using (var writer = shellFile.Properties.GetPropertyWriter())
{
writer.WriteProperty(shellFile.Properties.System.Keywords, list.ToArray(), true);
writer.Close();
}
}
}
finally
{
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
我在代码包中查看了可用于完全删除属性的任何内容,但我找不到任何方法可以这样做,我只能删除关键字值。任何人都会对如何执行此操作有想法?它不一定是 .NET 代码,也可以是命令行工具或 win32 代码。