【问题标题】:Taglib array exception when setting Artist field设置 Artist 字段时的 Taglib 数组异常
【发布时间】:2014-04-29 14:48:22
【问题描述】:

在此编辑 ID3 数据的函数中,我不断收到 Taglib.tag.Performers 的数组越界异常。我在其他地方读到清除 tag.performers[] 可以提供帮助(如果为 null),但有时我仍然会收到错误。

错误信息:

"索引超出了数组的范围。数据:

'System.Collections.ListDictionaryInternal' for test.mp3"

var fileArr = Directory.GetFiles(BasePath, "*.*", SearchOption.AllDirectories).Where(s => s.EndsWith(".mp3") || s.EndsWith(".m4a")).ToArray();

foreach (var file in fileArr)
{
    string fileName = Path.GetFileName(file);
    string tagArtist = "";
    string tagTitle = "";
    string tempRegFilename = fileName;
    string title = "";

    //Apply to tag
    TagLib.File mp3tag = TagLib.File.Create(file);

    if (mp3tag.Tag.Title != null && mp3tag.Tag.Title.Length > 1)
    {
        title = mp3tag.Tag.Title;
    } 
    else
    {
        mp3tag.Tag.Title = String.Empty;
    }

    if (mp3tag.Tag.Performers[0].Length < 1 || mp3tag.Tag.Performers[0] == null)
    {
        mp3tag.Tag.Performers[0] = null;
        mp3tag.Tag.Performers = new[] { String.Empty };
        mp3tag.Save();
    }

    if (mp3tag.Tag.Performers[0].Length > 1)
    {
        string[] performers = mp3tag.Tag.Performers;
        if (title.Length > 2 && performers[0].Length > 1)
        {
            tagTitle = title;
            tagArtist = performers[0].ToString();
            Log.Info("ID3 Artist: " + "[" + tagArtist + "]");
            Log.Info("ID3 Title: " + "[" + tagTitle + "]");
            Log.Info("Tag data OK");
        }
    }
    //Get artist from filename
    if (mp3tag.Tag.Performers[0].Length < 1 || mp3tag.Tag.Performers == null)
    {
        mp3tag.Tag.Performers = new[] { String.Empty };
        string prevArtist = String.Empty;

        if (tempRegFilename.Contains("-"))
        {
            Log.Info("Artist data missing...");
            string[] words = tempRegFilename.Split('-');
            {
                words[0] = words[0].Trim();
                string perf = words[0];
                mp3tag.Tag.Performers = new[] { perf };
                Log.Info("Artists changed from \'" + prevArtist + "\' to " + "'" + perf + "'" + "\r\n");
                mp3tag.Save();
            }
        }
        mp3tag.Save();
    }
}

catch (Exception ex)
{
    Log.Error("TAG EXCEPTION: " + ex.Message + "Data: " + "'" + ex.Data + "'" + " for " + fileName + "\r\n" + ex.HelpLink);
}

谁能看出有什么问题?我没有太多经验,可以使用帮助。谢谢。

【问题讨论】:

  • 你在哪里声明fileArr你能显示所有相关代码吗
  • 代码已更新

标签: c# taglib


【解决方案1】:

您似乎在很多地方都假设mp3Tag.Tag.Performers 将至少包含一个元素。如果没有,那么您将在尝试访问 mp3tag.Tag.Performers[0] 时遇到您提到的异常

看起来您可能正试图用这段代码来捕捉这种可能性:

if (mp3tag.Tag.Performers[0].Length < 1 || mp3tag.Tag.Performers[0] == null)
{
    mp3tag.Tag.Performers[0] = null;
    mp3tag.Tag.Performers = new[] { String.Empty };
    mp3tag.Save();
}

但您的逻辑不正确:您从数组中获取第一个元素(显然是 string)并检查 its 长度,而不是检查数组本身的长度。试试这个:

if (mp3tag.Tag.Performers.Length < 1 || mp3tag.Tag.Performers[0] == null)
{
    mp3tag.Tag.Performers = new[] { String.Empty };
    mp3tag.Save();
}

PS:如果您的日志包含异常的堆栈跟踪,而不仅仅是其消息,您将更容易查看错误所在。我通常发现最好只在异常本身上使用ToString()

【讨论】:

  • 谢谢,我做了这些更改,但仍然出现“数组越界”错误。有什么建议吗?
  • @3lysium:下一行存在同样的问题。我更新了我的答案,但下次请先尝试调试或查看堆栈跟踪。
  • 除了在应用程序中进行测试外,我还没有找到调试 Windows 服务的好方法。我现在在查看每个实例中的 Performers[0] 之前检查数组是否有元素,问题就解决了。非常感谢您的帮助。
  • @3lysium:我强烈建议您将程序分解成可以单独测试的组件,而不必将整个程序作为服务运行。您提供的代码可以很容易地放在一个可以从测试台调用的独立方法中。不过,我很高兴能够提供帮助。
  • 是的,我在构建过程中痛苦地意识到了这一点。既然它正在工作,我只是懒得回去解开一切。下次会这样做,再次感谢。
猜你喜欢
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
  • 2019-09-02
  • 2017-06-22
  • 2021-07-02
相关资源
最近更新 更多