首页 > 解决方案 > 如何更新 ShellFile 的不可变属性

问题描述

所以我正在尝试创建一个大众媒体编辑器,它允许用户更新媒体文件类型的属性。我正在使用 Microsoft 的 ShellFile API 包。

using Microsoft.WindowsAPICodePack.Shell;
using Microsoft.WindowsAPICodePack.Shell.PropertySystem;

所以我可以使用 ShellFile 类来编辑元数据属性,例如评级、标签、标题、应用程序名称等。

我遇到了最终具有多个项目(例如标签、作者、艺术家)的字段的问题,因为它们属于以下类型:

public ShellProperty<string[]> Author { get; }

例如,假设您有多个项目。

图片的属性(关注作者)

如果您尝试通过代码在属性窗口之外更新这些内容,请说:

       ShellFile shellFile = ShellFile.FromFilePath(((Media)mediaFile).FilePath);

        if (mediaFile is Picture)
        { 
            String[] authorArray = ((Picture)mediaFile).Authors.Split(',');

            shellFile.Properties.System.Author.Value = authorArray;
            /*** Writing other values to mediaFile ***/
        }

如果您尝试将更多作者/标签/任何内容添加到文件中,这会导致您收到此错误:

System.ArgumentOutOfRangeException: 'A value had to be truncated in a string or rounded if a numeric value. Set AllowTruncatedValue to true to prevent this exception. Parameter name: value'

我想知道是否有办法解决这个问题?因为它是 API 的一个属性,并且数组是不可变的,我实际上不能让它变大,或者使用更友好的东西,比如List <String>. 我试过Array.Resize了,但是我没有任何运气。

标签: c#.netwpf

解决方案


所以我找到了为什么我得到超出范围异常的答案。在尝试找到一种方法来使用我在grek40的帖子中更新的值创建新的 string[] {} 格式时,我遇到了以下代码片段,无论旧属性值的大小如何,它都有效:

string[] x =  {"1","2","3"};
x = x.Select(( Y ) => { return Y; }).ToArray();

我还注意到加载时的格式如下所示:

1,2,3

似乎当我尝试创建 authorArray 时,我使用以下代码:

string[] authorArray = ((Picture)mediaFile).Authors.Split(',');

如果您有给定的字符串,例如

作者 1,作者 2,作者 3

这将数组拆分为

  • “作者 1”
  • 《作者二》
  • 《作者3》

显然,条目开头的空格似乎会导致截断。基本上,在将字符串数组的输出.Trim()分配给 ShellFile 属性之前,我必须对其进行清理。


推荐阅读