Hallo Martin,

Wie vor einigen Tagen versprochen poste ich hier ein kurzes Beispiel zum
Auslesen der ID3v1-Tags aus MP3-Dateien.
No warranty! ;-)

Gru�,

Bj�rn Waide


/************************************************
 * MP3FileInfo
 * 
 * Diese Demo-Konsolen-Applikation liest alle im
 * �bergebenen Pfad enthaltenen MP3-Dateien ein
 * und gibt die Namen plus evtl. vorhandener
 * ID3v1-Infos aus.
 * 
 * Autor: Bj�rn Waide ([EMAIL PROTECTED])
 * Erstellt: 02/2002
 * 
 ************************************************/
using System; 
using System.IO;
using System.Collections;
using System.Text.RegularExpressions;

namespace MP3
{       
        /// <summary>
        /// Dient nur als Datenstrukur f�r die ID3v1-Informationen.
        /// </summary>
        public class ID3v1Info 
        {
                public String Title;
                public String Artist;
                public String Album;
                public int Year;
                public String Comment;
                public byte Genre;
                public byte Track;
        }//end ID3v1Info


        public class MP3FileInfo
        {
                /// <summary>
                /// Liest alle im Pfad enthaltenen Dateien, die dem
Suchmuster entsprechen,
                /// ein und gibt Dateiname plus evtl. vorhandener
ID3v1-Tags auf der Konsole
                /// aus.
                /// </summary>
                /// <param name="path">Absoluter Pfad des einzulesenden
Verzeichnisses.</param>
                /// <param name="search">Suchpattern f�r die
Dateinamen.</param>
                public static void ShowFiles(String path, String search)
                {
                        try 
                        {
                                string[] allFiles =
Directory.GetFiles(path, search);
                                for (int i=0; i<allFiles.Length; i++)
                                {
                                        FileInfo info = new
FileInfo(allFiles[i]);
                                        ID3v1Info id3Info =
ReadID3v1Info(info);
                                        
                                        Console.WriteLine("\nName    : "
+ info.Name);
                                        if (id3Info != null)
                                        {
                                                Console.WriteLine("Album
: " + id3Info.Album);
        
Console.WriteLine("Artist  : " + id3Info.Artist);
        
Console.WriteLine("Comment : " + id3Info.Comment);
                                                Console.WriteLine("Genre
: " + id3Info.Genre);
                                                Console.WriteLine("Title
: " + id3Info.Title);
                                                Console.WriteLine("Track
: " + id3Info.Track);
                                                Console.WriteLine("Year
: " + id3Info.Year);
                                        }//if
                                }//for
                        } 
                        catch (Exception e)
                        {
                                throw e;
                        }//try/catch
                }//ShowFiles


                /// <summary>
                /// Besorgt die ID3v1 Informationen aus der mp3-Datei
                /// und speichert sie in dem Struct ID3v1Info
                /// </summary>
                /// <param name="file"></param>
                /// <returns></returns>
                public static ID3v1Info ReadID3v1Info(FileInfo file)
                {
                        Stream s = file.OpenRead();
    
                        //bei 0 Byte Dateien
                        if (s.Length < 128)
                        {
                                return null;
                        }//end if
                        // Now read in s into a byte buffer.
                        byte[] bytes = new byte[128];
                        s.Seek(-128, SeekOrigin.End);
                        int numBytesToRead = 128;
                        int numBytesRead = 0;
                        while (numBytesToRead > 0) 
                        {
                                // Read may return anything from 0 to
numBytesToRead.
                                int n = s.Read(bytes, numBytesRead,
numBytesToRead);
                                if (n==0)  // We're at EOF
                                        break;
                                numBytesRead += n;
                                numBytesToRead -= n;
                        }//end while
    
                        s.Close();
    
                        //hat file �berhaupt ein ID3v1 Abschnitt?
                        //Dieser mu� mit "TAG" beginnen
                        String tag = ConvertByteToString(bytes, 0, 2);
                        if (tag != "TAG")
                        {
                                return null;
                        }
                        ID3v1Info TagInfo = new ID3v1Info();
                        TagInfo.Title = ConvertByteToString(bytes, 3,
32);
                        TagInfo.Artist = ConvertByteToString(bytes, 33,
62);
                        TagInfo.Album = ConvertByteToString(bytes, 63,
92);
                        try
                        {
                                TagInfo.Year =
Int32.Parse(ConvertByteToString(bytes, 93, 96));
                        } 
                        catch (FormatException)
                        {
                                TagInfo.Year = 0;
                        }//end try/catch
                        byte flag = bytes[125];
                        if (flag == 0)
                        { 
                                TagInfo.Comment =
ConvertByteToString(bytes, 97, 124);
                                TagInfo.Track = bytes[126];
                        } 
                        else 
                        {
                                TagInfo.Comment =
ConvertByteToString(bytes, 97, 126);
                                TagInfo.Track = 0;
                        }//end if flag
                        TagInfo.Genre = bytes[127];
    
                        return TagInfo;
                }//end ReadID3v1Info


                /// <summary>
                /// Gibt ein �bergebenes Byte-Array als String zur�ck.
                /// Dabei wird nur der Ausschnitt von pos1 bis pos2
ber�cksichtigt
                /// </summary>
                /// <param name="bytes">Zu konvertierendes
Byte-Array</param>
                /// <param name="pos1">Position, ab der konvertiert
werden soll.</param>
                /// <param name="pos2">Position, bis zu der konvertiert
werden soll.</param>
                /// <returns></returns>
                public static String ConvertByteToString(byte[] bytes,
int pos1, int pos2)
                {
    
                        //pos2 mu� gr��er oder gleich pos1 sein und
                        //pos2 darf L�nge des Arrays nicht �berschreiten
                        if ((pos1 > pos2) || (pos2 > bytes.Length - 1))
                        {
                                throw new ArgumentException("Aruments
out of range");
                        }
    
                        //L�nge des zu betrachtenden Ausschnittes
                        int length = pos2 - pos1 + 1;
    
                        //neues Char-Array anlegen der L�nge length
                        Char[] chars = new Char[length];
    
                        //packe alle Byte von pos1 bis pos2 als
                        //Char konvertiert in Array chars
                        for (int i=0; i<length; i++)
                        {
                                chars[i] =
Convert.ToChar(bytes[i+pos1]);
                        }//end for
    
                        //konvertiere Char-Array in String und gebe es
zur�ck
                        return new String(chars);
                }//end ConvertByteToString


                /// <summary>
                /// Einstiegs-Methode. Als Parameter werden der
einzulesende Pfadname
                /// und optional ein Suchpattern der Form "*.mp3"
erwartet.
                /// </summary>
                [STAThread]
                static public void Main(string[] args)
                {
                        String search = "*.mp3";
                        if (args.Length < 1)
                        {
                                Console.WriteLine("Angabe eines
Pfadnamens erforderlich!");
                                return;
                        } 
                        else 
                        {
                                if (args.Length >= 2)
                                {
                                        search = args[1];
                                }//if
                        }//if
        
                        try 
                        {
                                ShowFiles(args[0], search);     
                        } 
                        catch (ArgumentException e)
                        {
                                Console.WriteLine("Error: " +
e.Message);
                        } 
                        catch (Exception e)
                        {
                                Console.WriteLine("Error: " +
e.Message);
                        }//try/catch
                }//Main
        }//MP3FileInfo
}//MP3


| [dotnetdecsharp] als [email protected] subscribed
| http://www.dotnetgerman.com/archiv/dotnetdecsharp/ = Listenarchiv
| Listenregeln, sowie An- und Abmeldung zu dieser Liste:
| http://www.dotnetgerman.com/listen/dotnetdecsharp.asp

Antwort per Email an