如何解决组织和访问xml数据库中的数据的问题-VB.Net
因此,我为音乐播放器创建了一个XML数据库,用于存储歌曲数据(标题,艺术家,专辑,流派,年份),用于生成数据库的代码可以正常工作,但是速度很慢,如下图所示。 / p>
|Aritsts Database >|Aritst ->(Name,Songs,Count)
Music Library -->For Loop> Xml Database|Albums Database >|Album ->(Name,Count)
|Genres Database >|Genre ->(Name,Count)
|Years Database >|Year ->(Name,Count)
艺术家数据库的示例(专辑,年份和流派的其余部分相同)
因此,我们要做的是遍历音乐库并将艺术家,专辑,流派和年份分别存储在4个单独的List(Of String)
中,然后从列表中删除重复项,然后制作一个List(Of String)
(歌曲列表)然后,我循环访问XMLDocument
中加载的所有Artist XML数据库,如果Artist已经存在,它将歌曲添加到当前艺术家,否则将创建一个新的Artist节点并将歌曲添加到其中
唯一的问题是它太慢了,我认为这是代码的问题,但是我不知道如何解决。这是代码:
Dim OldCount As Double = My.Settings.MusicLibrary.Count
My.Settings.MusicLibrary.Clear()
Dim filters As String = "*.mp3|*.wav|*.aiff|*.mp2|*.mp1|*.ogg|*.wma|*.flac|*.alac|*.webm"
For Each path In My.Settings.librarypath
Dim files
If My.Settings.DirectoryTopOpen = True Then
files = filters.Split("|"c).SelectMany(Function(filter) System.IO.Directory.GetFiles(path,filter,IO.SearchOption.TopDirectoryOnly)).ToArray()
Else
files = filters.Split("|"c).SelectMany(Function(filter) System.IO.Directory.GetFiles(path,IO.SearchOption.AllDirectories)).ToArray()
End If
For Each file In files
My.Settings.MusicLibrary.Add(file)
Next
Next
Dim ArtistList As New List(Of String)
Dim AlbumList As New List(Of String)
Dim Tagger = Nothing
For Each track In My.Settings.MusicLibrary
Tagger = TagLib.File.Create(track)
ArtistList.Add(Tagger.Tag.JoinedPerformers)
AlbumList.Add(Tagger.Tag.Album)
Tagger = Nothing
Next
Dim NartistList = ArtistList.Distinct.ToList
Dim NalbumList = AlbumList.Distinct.ToList
My.Settings.ArtistLibrary.Clear()
My.Settings.AlbumLibrary.Clear()
For Each artist In NartistList
My.Settings.ArtistLibrary.Add(artist)
Next
For Each album In NalbumList
My.Settings.AlbumLibrary.Add(album)
Next
Dim _Tagger
For Each song In My.Settings.MusicLibrary
_Tagger = TagLib.File.Create(song)
My.Forms.Form1.Library_Main.Items.Add(New ListViewItem({_Tagger.Tag.Title,_Tagger.Tag.JoinedPerformers,_Tagger.Tag.Album,_Tagger.Properties.Duration.TotalMinutes.ToString.Substring(0,4).Replace(".",":"),_Tagger.Tag.Year,_Tagger.Properties.AudioBitrate,_Tagger.Properties.AudioChannels,_Tagger.Properties.AudioSampleRate,_Tagger.Properties.BitsPerSample,_Tagger.Properties.MediaTypes.ToString,song}))
Next
settings_rebuildlib.Checked = False
My.Forms.Form1.ShowNotification("Scanner","Added " & My.Settings.MusicLibrary.Count - OldCount & " To the library","Mr.Audio • Settings • Scanner",My.Resources.radar1,Color.DodgerBlue)
UpdateLibStatistics()
Dim WithEvents BG_LIB_UPDATOR As New BackgroundWorker With {.WorkerReportsProgress = True,.WorkerSupportsCancellation = True}
Public Sub UpdateLibStatistics()
Library_upd_overlay.Visible = True
Library_upd_overlay.BringToFront
BG_LIB_UPDATOR.RunWorkerAsync()
Private Sub BG_SCANER_DoWork(sender As Object,e As DoWorkEventArgs) Handles BG_SCANER.DoWork
BG_SCANER.ReportProgress(0)
Try
Dim NewSongs As New List(Of String)
If settings_scanlib.Checked = True Then
Dim OldCount As Double = My.Settings.MusicLibrary.Count
Dim OldLibrary As String()
ReDim OldLibrary(OldCount - 1)
My.Settings.MusicLibrary.CopyTo(OldLibrary,0)
My.Settings.MusicLibrary.Clear()
Dim filters As String = "*.mp3|*.wav|*.aiff|*.mp2|*.mp1|*.ogg|*.wma|*.flac|*.alac|*.webm"
For Each path In My.Settings.librarypath
Dim files
If My.Settings.DirectoryTopOpen = True Then
files = filters.Split("|"c).SelectMany(Function(filter) System.IO.Directory.GetFiles(path,IO.SearchOption.AllDirectories)).ToArray()
End If
For Each file In files
If OldLibrary.Contains(file) Then
My.Settings.MusicLibrary.Add(file)
Else
NewSongs.Add(file)
My.Settings.MusicLibrary.Add(file)
End If
Next
Next
Dim ArtistList As New List(Of String)
Dim AlbumList As New List(Of String)
Dim Tagger = Nothing
For Each track In My.Settings.MusicLibrary
Tagger = TagLib.File.Create(track)
ArtistList.Add(Tagger.Tag.JoinedPerformers)
AlbumList.Add(Tagger.Tag.Album)
Tagger = Nothing
Next
Dim NartistList = ArtistList.Distinct.ToList
Dim NalbumList = AlbumList.Distinct.ToList
My.Settings.ArtistLibrary.Clear()
My.Settings.AlbumLibrary.Clear()
For Each artist In NartistList
My.Settings.ArtistLibrary.Add(artist)
Next
For Each album In NalbumList
My.Settings.AlbumLibrary.Add(album)
Next
BG_SCANER.ReportProgress(20)
'Updating Lib stats
For Each track In My.Settings.MusicLibrary
Tagger = TagLib.File.Create(track)
ArtistList.Add(Tagger.Tag.JoinedPerformers)
AlbumList.Add(Tagger.Tag.Album)
Tagger = Nothing
Next
NartistList = ArtistList.Distinct.ToList
NalbumList = AlbumList.Distinct.ToList
My.Settings.ArtistLibrary.Clear()
My.Settings.AlbumLibrary.Clear()
My.Settings.YearLibrary.Clear()
My.Settings.GenreLibrary.Clear()
For Each artist In NartistList
My.Settings.ArtistLibrary.Add(artist)
Next
For Each album In NalbumList
My.Settings.AlbumLibrary.Add(album)
Next
'Updating XML files
Dim LIB_ARTISTtpath As String = ""
Dim LIB_ALBUMtpath As String = ""
Dim LIB_YEARtpath As String = ""
Dim LIB_GENREtpath As String = ""
Dim ErrorList As New List(Of String)
If IO.File.Exists(IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),"MrAudio","Library","Artists.xml")) Then
LIB_ARTISTtpath = IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),"Artists.xml")
Else
ErrorList.Add("LIB_ARTISTS")
End If
If IO.File.Exists(IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),"Albums.xml")) Then
LIB_ALBUMtpath = IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),"Albums.xml")
Else
ErrorList.Add("LIB_ALBUMS")
End If
If IO.File.Exists(IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),"Years.xml")) Then
LIB_YEARtpath = IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),"Years.xml")
Else
ErrorList.Add("LIB_YEARS")
End If
If IO.File.Exists(IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),"Genres.xml")) Then
LIB_GENREtpath = IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),"Genres.xml")
Else
ErrorList.Add("LIB_GENRES")
End If
If ErrorList.Count > 0 Then
e.Result = ErrorList
Exit Sub
End If
Dim ARTIST_XML As New XmlDocument
Dim ALBUMS_XML As New XmlDocument
Dim YEARS_XML As New XmlDocument
Dim GENRES_XML As New XmlDocument
Try
ARTIST_XML.Load(LIB_ARTISTtpath)
ALBUMS_XML.Load(LIB_ALBUMtpath)
YEARS_XML.Load(LIB_YEARtpath)
GENRES_XML.Load(LIB_GENREtpath)
Catch ex As Exception
Console.WriteLine(DateTime.Now.ToShortTimeString & ": At BG_SCANNER_DoWork_READ_XML_FILE //" & ex.Message & vbCrLf & ex.StackTrace)
MessageBox.Show(Me,"An error occured on Library files." & vbCrLf & "Check the debug console for more informations.","Mr. Audio",MessageBoxButtons.OK,MessageBoxIcon.Error)
e.Result = False
Exit Sub
End Try
BG_SCANER.ReportProgress(40)
'Writing To Aritsts
For Each artist As XmlNode In ARTIST_XML.LastChild.FirstChild.ChildNodes
For i As Integer = 0 To NewSongs.Count - 1
Try
Tagger = TagLib.File.Create(NewSongs(i))
If artist.FirstChild.InnerText = Tagger.Tag.JoinedPerformers Then
Dim Nsong As XmlNode = ARTIST_XML.CreateElement("Song")
Nsong.InnerText = NewSongs(i)
artist.ChildNodes(1).AppendChild(Nsong)
artist.ChildNodes(2).InnerText += 1
Else
If NewSongs.Count > 0 Then
Dim ArtOnlyList As New List(Of String)
For Each song In NewSongs
Tagger = TagLib.File.Create(song)
ArtOnlyList.Add(Tagger.Tag.JoinedPerformers)
Next
ArtOnlyList = ArtOnlyList.Distinct.ToList
For Each _artist In ArtOnlyList
Dim Zroot As XmlNodeList = ARTIST_XML.SelectNodes("/Mr.Audio/Artists/Artist")
Dim Znode As XmlNode = ARTIST_XML.CreateElement("Artist")
Dim Zname As XmlNode = ARTIST_XML.CreateElement("Name")
Zname.InnerText = _artist
Dim ZSongsNode As XmlNode = ARTIST_XML.CreateElement("Songs")
Dim ZFirstSong As XmlNode = ARTIST_XML.CreateElement("Song")
Dim ZCount As XmlNode = ARTIST_XML.CreateElement("Count")
ZCount.InnerText = 0
For Each song In NewSongs
Tagger = TagLib.File.Create(song)
If artist = Tagger.Tag.JoinedPerformers Then
ZFirstSong = ARTIST_XML.CreateElement("Song")
ZFirstSong.InnerText = song
ZSongsNode.AppendChild(ZFirstSong)
ZCount.InnerText += 1
Image.FromStream(New MemoryStream(CType(Tagger.Tag.Tag.Pictures(0).Data.Data,Byte()))).GetThumbnailImage(100,100,Nothing,IntPtr.Zero).Clone.Save(IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),"ArtistsPics",Tagger.Tag.JoinedPerformers & ".png"))
End If
Next
Znode.AppendChild(Zname)
Znode.AppendChild(ZSongsNode)
Znode.AppendChild(ZCount)
ARTIST_XML.LastChild.FirstChild.AppendChild(Znode)
Next
End If
End If
Catch ex As Exception
End Try
Next
Next
ARTIST_XML.Save(LIB_ARTISTtpath)
BG_SCANER.ReportProgress(60)
'Writing to albums
For Each album As XmlNode In ALBUMS_XML.LastChild.FirstChild.ChildNodes
For i As Integer = 0 To NewSongs.Count - 1
Try
Tagger = TagLib.File.Create(NewSongs(i))
If album.FirstChild.InnerText = Tagger.Tag.Album Then
Dim Nsong As XmlNode = ALBUMS_XML.CreateElement("Song")
Nsong.InnerText = NewSongs(i)
album.ChildNodes(1).AppendChild(Nsong)
album.ChildNodes(2).InnerText += 1
Else
If NewSongs.Count > 0 Then
Dim AlbOnlyList As New List(Of String)
For Each song In NewSongs
Tagger = TagLib.File.Create(song)
AlbOnlyList.Add(Tagger.Tag.Album)
Next
AlbOnlyList = AlbOnlyList.Distinct.ToList
For Each _album In AlbOnlyList
Dim Zroot As XmlNodeList = ALBUMS_XML.SelectNodes("/Mr.Audio/Albums/Album")
Dim Znode As XmlNode = ALBUMS_XML.CreateElement("Album")
Dim Zname As XmlNode = ALBUMS_XML.CreateElement("Name")
Zname.InnerText = _album
Dim ZSongsNode As XmlNode = ALBUMS_XML.CreateElement("Songs")
Dim ZFirstSong As XmlNode = ALBUMS_XML.CreateElement("Song")
Dim ZCount As XmlNode = ALBUMS_XML.CreateElement("Count")
ZCount.InnerText = 0
For Each song In NewSongs
Tagger = TagLib.File.Create(song)
If album = Tagger.Tag.Album Then
ZFirstSong = ALBUMS_XML.CreateElement("Song")
ZFirstSong.InnerText = song
ZSongsNode.AppendChild(ZFirstSong)
ZCount.InnerText += 1
Image.FromStream(New MemoryStream(CType(Tagger.Tag.Tag.Pictures(0).Data.Data,"AlbumsPics",Tagger.Tag.Album & ".png"))
End If
Next
Znode.AppendChild(Zname)
Znode.AppendChild(ZSongsNode)
Znode.AppendChild(ZCount)
ALBUMS_XML.LastChild.FirstChild.AppendChild(Znode)
Next
End If
End If
Catch ex As Exception
End Try
Next
Next
ALBUMS_XML.Save(LIB_ALBUMtpath)
BG_SCANER.ReportProgress(70)
'Writing to years
For Each year As XmlNode In YEARS_XML.LastChild.FirstChild.ChildNodes
For i As Integer = 0 To NewSongs.Count - 1
Try
Tagger = TagLib.File.Create(NewSongs(i))
If year.FirstChild.InnerText = Tagger.Tag.Year Then
Dim Nsong As XmlNode = YEARS_XML.CreateElement("Song")
Nsong.InnerText = NewSongs(i)
year.ChildNodes(1).AppendChild(Nsong)
year.ChildNodes(2).InnerText += 1
Else
If NewSongs.Count > 0 Then
Dim YearOnlyList As New List(Of String)
For Each song In NewSongs
Tagger = TagLib.File.Create(song)
YearOnlyList.Add(Tagger.Tag.Year)
Next
YearOnlyList = YearOnlyList.Distinct.ToList
For Each _Year In YearOnlyList
Dim Zroot As XmlNodeList = YEARS_XML.SelectNodes("/Mr.Audio/Years/Year")
Dim Znode As XmlNode = YEARS_XML.CreateElement("Year")
Dim Zname As XmlNode = YEARS_XML.CreateElement("Name")
Zname.InnerText = _Year
Dim ZSongsNode As XmlNode = YEARS_XML.CreateElement("Songs")
Dim ZFirstSong As XmlNode = YEARS_XML.CreateElement("Song")
Dim ZCount As XmlNode = YEARS_XML.CreateElement("Count")
ZCount.InnerText = 0
For Each song In NewSongs
Tagger = TagLib.File.Create(song)
If _Year = Tagger.Tag.Year Then
ZFirstSong = YEARS_XML.CreateElement("Song")
ZFirstSong.InnerText = song
ZSongsNode.AppendChild(ZFirstSong)
ZCount.InnerText += 1
GenerateImage(Tagger.Tag.Year).GetThumbnailImage(100,"YearsPics",Tagger.Tag.Year & ".png"))
End If
Next
Znode.AppendChild(Zname)
Znode.AppendChild(ZSongsNode)
Znode.AppendChild(ZCount)
YEARS_XML.LastChild.FirstChild.AppendChild(Znode)
Next
End If
End If
Catch ex As Exception
End Try
Next
Next
YEARS_XML.Save(LIB_YEARtpath)
BG_SCANER.ReportProgress(80)
'Writing to genres
For Each genre As XmlNode In GENRES_XML.LastChild.FirstChild.ChildNodes
For i As Integer = 0 To NewSongs.Count - 1
Try
Tagger = TagLib.File.Create(NewSongs(i))
If genre.FirstChild.InnerText = String.Join(";",Tagger.Tag.Genres) Then
Dim Nsong As XmlNode = GENRES_XML.CreateElement("Song")
Nsong.InnerText = NewSongs(i)
genre.ChildNodes(1).AppendChild(Nsong)
genre.ChildNodes(2).InnerText += 1
Else
If NewSongs.Count > 0 Then
Dim GenreOnlyList As New List(Of String)
For Each song In NewSongs
Tagger = TagLib.File.Create(song)
GenreOnlyList.Add(String.Join(";",Tagger.Tag.Genres))
Next
GenreOnlyList = GenreOnlyList.Distinct.ToList
For Each _Genre In GenreOnlyList
Dim Zroot As XmlNodeList = GENRES_XML.SelectNodes("/Mr.Audio/Genres/Genre")
Dim Znode As XmlNode = GENRES_XML.CreateElement("Genre")
Dim Zname As XmlNode = GENRES_XML.CreateElement("Name")
Zname.InnerText = _Genre
Dim ZSongsNode As XmlNode = GENRES_XML.CreateElement("Songs")
Dim ZFirstSong As XmlNode = GENRES_XML.CreateElement("Song")
Dim ZCount As XmlNode = GENRES_XML.CreateElement("Count")
ZCount.InnerText = 0
For Each song In NewSongs
Tagger = TagLib.File.Create(song)
If _Genre = String.Join(";",Tagger.Tag.Genres) Then
ZFirstSong = GENRES_XML.CreateElement("Song")
ZFirstSong.InnerText = song
ZSongsNode.AppendChild(ZFirstSong)
ZCount.InnerText += 1
GenerateImage(String.Join(";",CType(Tagger,TagLib.File).Tag.Genres)).GetThumbnailImage(100,Tagger.Tag.JoinedPerformers & ".png"))
End If
Next
Znode.AppendChild(Zname)
Znode.AppendChild(ZSongsNode)
Znode.AppendChild(ZCount)
GENRES_XML.LastChild.FirstChild.AppendChild(Znode)
Next
End If
End If
Catch ex As Exception
End Try
Next
Next
GENRES_XML.Save(LIB_GENREtpath)
BG_SCANER.ReportProgress(100)
settings_scanlib.Checked = False
End If
Catch ex As Exception
Console.WriteLine(My.Computer.Clock.LocalTime.ToShortTimeString & ": At BG_SCANNER_DoWork //" & ex.Message & vbCrLf & ex.StackTrace)
End Try
End Sub
先谢谢了。 编辑:XML文件将包含大约500首歌曲,具体取决于用户库,该代码现在在400首歌曲库中大约需要10分钟,该应用程序当前使用的最大RAM为140〜200 mb
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。