日期:2011-10-13  浏览次数:20376 次


音乐文件列表也是个不容忽视的问题,自己定个格式当然可以,但好在大家熟悉的M3U格式并不复杂,MediaPlayer或WinAmp都支持它,通用性也好,比起wpl要简易得多,所以我就来介绍一下M3U格式文件的制作与读写

M3U是文本文件,以#EXTM3U开头,每个音乐条目占1-2行,当存在扩展信息时,首行采用#EXTINF:开头,第二行才是文件名;当没有扩展信息时,只是简单的一行,就是文件名;文件名可包含路径,也可不包含,不包含时音乐文件应该是与M3U文件在同一目录下。

整个格式就这么简单,下面是读取函数,与保存函数,读取时返回的是一个M3U集合,每个集合项目为一首音乐信息的字符串,想获取这个串的具体内容, 可用GetM3UInfo函数返回MusicInfo结构。

保存函数不太完善,需传入一个M3U集合,因使用集合传递M3U字串信息,每个条目只能添加删除,不能直接修改。若有兴趣,可采取类封装MusicInfo结构,并提供修改功能。

Private Function LoadM3UFile(strFileName As String) As Collection
    Dim a() As String, s1 As String, s As String, i As Long, FileLine() As String
    Dim blnAddOK As Boolean, strFilePath As String, colTemp As Collection, LineNum As Long
    On Error GoTo fail
    Set colTemp = New Collection
    If Dir(strFileName) = vbNullString Then GoTo fail
    strFilePath = Left$(strFileName, InStrRev(strFileName, "\"))
    Open strFileName For Binary As #1
        s = Input(LOF(1), 1)
    Close
    If s = vbNullString Then GoTo fail
    i = InStr(1, s, "#EXTM3U", vbTextCompare)
    If i = 0 Then GoTo fail
    If i > 1 Then s = Mid$(s, i)
    s = Trim$(Replace$(s, vbCrLf & vbCrLf, vbCrLf))
    FileLine = Split(s, vbCrLf)
        Do While LineNum <= UBound(FileLine)
            s = Trim$(FileLine(LineNum))
            If s <> vbNullString Then
                blnAddOK = False
                If UCase$(Left$(s, 8)) <> "#EXTINF:" Then
                    If InStr(1, s, ":\") = 0 Then
                        s = strFilePath & s
                        If Dir(s, vbNormal Or vbHidden Or vbReadOnly Or vbSystem Or vbArchive) <> vbNullString Then blnAddOK = True
                    Else
                        If Dir(s, vbNormal Or vbHidden Or vbReadOnly Or vbSystem Or vbArchive) <> vbNullString Then
                            blnAddOK = True
                        Else
                            s = strFilePath & Mid$(s, InStrRev(s, "\") + 1)
                            If Dir(s, vbNormal Or vbHidden Or vbReadOnly Or vbSystem Or vbArchive) <> vbNullString Then blnAddOK = True
                      &