Die beiden hier bereits veröffentlichten Tips "Auslesen einer .m3u-Datei" und "Vollständiges Auslesen einer .m3u-Datei" bieten bereits gute Ansätze, was das Auslesen von .m3u-Dateien angeht, jedoch decken beide Artikel nicht das vollständige Spektrum möglicher .m3u-Varianten ab. Eine m3u-Datei kann in einfacher oder erweiterter Form (Extended M3U) vorliegen und Links zu Media-Dateien mit jeweils relativen oder absoluten Pfadangaben enthalten, so dass die genannten Beispiele nicht in jedem Falle funktionieren dürften. Der folgende Code liest eine .m3u-Datei in ein ListView-Control ein, wobei pro Listeneintrag der Dateiname der Media-Datei, die Spieldauer und der angezeigte Titel in Winamp ermittelt werden, genauso wie die Information, ob die Datei wirklich auch existiert (valider oder invalider Eintrag). Dabei spielt es keine Rolle, ob es sich bei der Playliste um eine schlichte Auflistung von Dateilinks handelt (einfache M3U) oder um eine erweiterte M3U oder letztlich gar um eine Kombination aus beidem. Weiterhin kommt die Funktion ReadM3U sowohl mit relativen als auch mit absoluten Pfadangaben einschlieszlich Netzwerkressourcen klar. Leerzeilen in der M3U werden ignoriert und Streams werden richtig erkannt. Der Code verwendet das Scripting.FileSystemObjekt, daher ist ein Verweis auf die Microsoft Scripting Runtime(scrrun.dll) notwendig. Option Explicit ' Deklarationen Private Type M3UEntry File As String Title As String Length As Long Exists As Boolean End Type ' Funktion ReadM3U ' Liest eine Playliste (m3u-Datei) in ein ' ListView-Control ein Private Function ReadM3U(ByVal sFilename As String, _ LV_Playlist As ListView) As Boolean Dim fso As New FileSystemObject Dim Playlist As File Dim litem As ListItem Dim ts As TextStream Dim Textzeile As String Dim Audio As M3UEntry Dim strLVText As String Dim stred As Long ReadM3U = True With LV_Playlist ' ListView-Spalten erstellen .Sorted = False .View = lvwReport .ColumnHeaders.Clear .ColumnHeaders.Add , , "Existiert?", 900 .ColumnHeaders.Add , , "Dateiname", .Width - 4900 .ColumnHeaders.Add , , "Länge", 1000 .ColumnHeaders.Add , , "Titel", 3000 ' ListView-Einträge löschen .ListItems.Clear End With If fso.FileExists(sFilename) Then Set Playlist = fso.GetFile(sFilename) Else MsgBox "Die einzulesende Playliste existiert nicht " _ & "-> die Operation wird beendet." ReadM3U = False Exit Function End If ' Playliste auslesen Set ts = fso.OpenTextFile(sFilename, ForReading) Do While Not ts.AtEndOfStream Textzeile = ts.ReadLine Select Case Textzeile Case Is = "#EXTM3U", "" ' ungültige Zeile(n) überspringen Case Else If Left$(Textzeile, 8) = "#EXTINF:" Then ' Zusatzinformationen: strLVText = Right$(Textzeile, Len(Textzeile) - 8) stred = InStr(strLVText, ",") If stred > 0 Then Audio.Length = CLng(Left$(strLVText, stred - 1)) Audio.Title = Right$(strLVText, Len(strLVText) - stred) End If Else ' Pfadangabe If Mid$(Textzeile, 2, 2) = ":\" Or Left$(Textzeile, 2) = "\\" Then ' absolute Pfadangabe oder Netzwerkpfad Audio.File = Textzeile Else ' relative Pfadangabe Audio.File = fso.BuildPath(Playlist.ParentFolder, Textzeile) End If Audio.Exists = fso.FileExists(Audio.File) If Not Audio.Exists Then ReadM3U = False ' Playlist-Element in das ListView eintragen With LV_Playlist If Audio.Exists Then Set litem = .ListItems.Add(, , "Ja") Else Set litem = .ListItems.Add(, , "Nein") End If litem.SubItems(1) = GetFileFromPath(Audio.File) If Audio.Length >= 0 Then litem.SubItems(2) = TimeFormat(Audio.Length) Else litem.SubItems(2) = "Stream" End If litem.SubItems(3) = Audio.Title End With ' Audio - Element wieder bereinigen Audio.File = "" Audio.Length = 0 Audio.Title = "" End If End Select Loop ts.Close Set Playlist = Nothing End Function ' Hilfsfunktion: ' Ermittelt den Dateinamen aus Pfad+Datei Private Function GetFileFromPath(Pfadname As String) Dim Dateinamen As String Dim Länge As Integer Dim n As Integer Dim Position As Integer Länge = Len(Pfadname) Do n = InStr(n + 1, Pfadname, "\") If n = 0 Then Exit Do Position = n Loop GetFileFromPath = Right$(Pfadname, Länge - Position) End Function ' Hilfsfunktion: ' wandelt die Zeitangabe in Sekunden in ' das Format 'hh:mm:ss' um Private Function TimeFormat(Seconds As Long) As String Dim h As Long Dim m As Long Dim hh As String Dim mm As String Dim ss As String ' Stunden ermitteln If Seconds > 0 Then h = Int(Seconds / 3600) Seconds = Seconds - (3600 * h) Else TimeFormat = "" Exit Function End If ' Minuten ermitteln If Seconds > 0 Then m = Int(Seconds / 60) Seconds = Seconds - (60 * m) End If ' zweistellig formatieren hh = Format$(h, "00") mm = Format$(m, "00") ss = Format$(Seconds, "00") TimeFormat = hh & ":" & mm & ":" & ss End Function Anwendungsbeispiel: Beispiel: Setzen Sie folgenden Code in das Button-Click-Ereignis: Private Sub Command1_Click() If ReadM3U("X:\Pfad\Playlistname.m3u", ListView1) Then MsgBox "Die eingelesene Playliste enthält korrekte Einträge." Else MsgBox "Die eingelesene Playliste enthält inkorrekte Einträge." End If End Sub Dieser Tipp wurde bereits 22.710 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
sevZIP40 Pro DLL Zippen und Unzippen wie die Profis! Mit nur wenigen Zeilen Code statten Sie Ihre Anwendungen ab sofort mit schnellen Zip- und Unzip-Funktionen aus. Hierbei lassen sich entweder einzelnen Dateien oder auch gesamte Ordner zippen bzw. entpacken. Tipp des Monats April 2024 Skyfloy Chart von Microsoft und dazu noch gratis Tutorial für Microsoft Chart Controls für Microsoft .NET Framework 3.5 Access-Tools Vol.1 Über 400 MByte Inhalt Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |