我从nuget获得了nuget包ID3.NET。我想通过他们的艺术家对mp3文件进行排序。但我真的不知道,使用带有mp3信息的文件的正确方法是什么。
DirectoryInfo rootDir = rootDir.GetFiles("*.mp3", SearchOption.AllDirectories);
foreach (FileInfo dir in fileList)
{
Console.WriteLine("{0}", dir);
using (var mp3 = new Mp3File(dir.FullName))
{
Id3Tag tag = mp3.GetTag(Id3TagFamily.FileStartTag);
Console.WriteLine("Title: {0}", tag.Title.Value);
Console.WriteLine("Artist: {0}", tag.Artists.Value);
Console.WriteLine("Album: {0}", tag.Album.Value);
}
}
通过例如对文件进行排序它们的大小,我使用这个工作代码。
fileList = rootDir.GetFiles(".", SearchOption.AllDirectories)
.Where(s => Worker.sExtensionFilerStrings
.Contains(Path.GetExtension(s.ToString()).ToLower()))
.OrderBy(jo => jo.Name);
答案 0 :(得分:0)
以下是您的示例最小扩展以允许按标记排序:
string[] musicFiles = Directory.GetFiles(@"D:\mp3test", "*.mp3");
// a structure to hold the filename and the tags object:
public struct mp3FileTags
{
public string fileName { get; set; }
public Id3Tag tags { get; set; }
public mp3FileTags(string fn, Id3Tag t)
{ this = new mp3FileTags(); fileName = fn; tags = t; }
}
// we create a list of the mp3FileTags objects:
List<mp3FileTags> mp3s = new List<mp3FileTags>();
foreach (string musicFile in musicFiles)
{
using (var mp3 = new Mp3File(musicFile))
{
Id3Tag tag = mp3.GetTag(Id3TagFamily.FileStartTag);
mp3s.Add(new mp3FileTags(musicFile, tag)); // fill the list
}
}
// now we can order it:
mp3s = mp3s.OrderBy(o => o.tags.Artists.ToString()).ToList();
// now we can use the ordered list:
foreach (mp3FileTags FTag in mp3s)
{
Id3Tag tag = FTag.tags;
Console.WriteLine("File: {0}", FTag.fileName);
Console.WriteLine("Title: {0}", tag.Title.Value.);
Console.WriteLine("Artist: {0}", tag.Artists.Value);
Console.WriteLine("Album: {0}", tag.Album.Value);
}
您可能会注意到我如何避免使用List
的数组 顺便说一句:我不相信我是否会使用ID3.Lib;它似乎没有记录并被遗弃.. 更新我已将结构中的直接Id3Tag
替换为包含文件名和标记的结构。您可以在那里添加更多数据,一个FileInfo对象..