C# 删除外壳文件属性

C# 删除外壳文件属性,c#,tiff,windows-api-code-pack,C#,Tiff,Windows Api Code Pack,本周,当应用于TIFF/TIF文件时,我遇到了一个有关Windows Shell属性系统的问题。我正在使用1.1.0.0访问属性系统 添加属性时,文件会损坏,因为它似乎存储在第一个IFD指针的预期位置。现在我不确定它是否只是在文件头(0x49 0x49 0x2A 0x00)之后的第5个字节插入自己,如果它覆盖了任何现有数据。此外,在比较IDF条目标题的十六进制时,字节看起来不同。现在,当我说损坏时,只有当以编程方式将文件作为字节流打开时,才知道文件是否添加了属性系统容器。它可以在Windows图

本周,当应用于TIFF/TIF文件时,我遇到了一个有关Windows Shell属性系统的问题。我正在使用1.1.0.0访问属性系统

添加属性时,文件会损坏,因为它似乎存储在第一个IFD指针的预期位置。现在我不确定它是否只是在文件头(0x49 0x49 0x2A 0x00)之后的第5个字节插入自己,如果它覆盖了任何现有数据。此外,在比较IDF条目标题的十六进制时,字节看起来不同。现在,当我说损坏时,只有当以编程方式将文件作为字节流打开时,才知道文件是否添加了属性系统容器。它可以在Windows图像预览中正常打开,但不能在我的客户端用来查看TIFF文件的软件中打开

下面是我如何添加属性(作为键=值字符串的数组)

public void SetFileTag(字符串文件名、字符串标记名、字符串标记值)
{
尝试
{
使用(var shellFile=shellFile.FromFilePath(文件名))
{
var keywords=shellFile.Properties.System.keywords.Value;
var keyValue=string.Concat(标记名“=”,tagValue);
var list=keywords==null?new list():新列表(关键字);
if(list.Contains(keyValue))
{
返回;
}
列表。添加(键值);
使用(var writer=shellFile.Properties.GetPropertyWriter())
{
writer.WriteProperty(shellFile.Properties.System.Keywords,list.ToArray(),true);
writer.Close();
}
}
}
最后
{
GC.Collect();
GC.WaitForPendingFinalizers();
}
}

我在代码包中查找了任何可以完全删除属性的方法,但是我找不到任何方法,我只能删除关键字值。任何人都会对如何实现这一点有想法吗?它不必是.NET代码,也可以是命令行工具或win32代码。

这似乎是不可能的,即使将每个帧提取到单独的文件中,似乎也会创建与原始文件不同的字节结构。我能够通过将所有文件转换为PDF来恢复它们,这在我们的情况下是一个很好的解决方案。
    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();
        }
    }