[C#] Liederverwaltung

krizzelfix

Commander
Registriert
Sep. 2005
Beiträge
2.626
Hallo User,

ich bin grade dabei eine alternative zu Winamp zu schreiben.
Hab eigentlich immer drauf losprogrammiert und geguckt was rausgekommen ist ;) nur diesmal lauf ich mit diesem Konzept vor die Wand.

Deswegen meine Frage an euch: Wie würdet ihr die Verwaltung der einzelnen Lieder schreiben. Habe es jetzt so das ich mir ein Dictionary<int, string> Files = new Dictionary<int, string>(); erstelle in dem ich den Key und Pfad zu der Datei speicher. Glaube Aber das ich damit nicht weit komme.

Bin für jeden Tipp dankbar,

Grüße

tewes
 
Ich würde die Verwaltung mit einer Datenbank realisieren und mit einer Export-/Import-Funktion versehen. Ansonsten die erforderlichen Daten einlesen und in einer XML-Datei speichern/abrufen.
 
Danke für deine Antwort Loopo,

denke das die DB schneller ist und daher besser geeignet.

Grüße

tewes

// Edit: Wie kann ich mir den die Datenbank erstellen?
Wenn ich für PHP programmiere habe ich da ja die PHPMyAdmin oberfläche. Wo finde ich sowas für lokale Datenbanken?

Oder kennt jemand ein gutes Tutorial wo das erklärt wird?

Grüße

tewes
 
Zuletzt bearbeitet:
iTunes realisiert die Verwaltung in einer XML-File.
Wenn du für das Programm einen lokalen SQL Server am laufen haben musst ist das etwas viel Ressourcenverbrauch finde ich.
 
Danke für deine Antwort RuL3R, aber wie sollt ich die Daten zur Laufzeit speichen? Wenn das Programm gestarte wird, wird ja die XML Datei ausgelesen und alles in den Speicher geschrieben. Welcher Datentyp wäre dafür denn geeignet?

Grüße

tewes
 
Wieso sollten denn die Daten während der Laufzeit auch in eine Datei gespeichert werden?
 
Ne ich mein wenn ich das Programm starte, wird die XML Datei ausgelesen. Und in welchem Datentyp (Dictionary o.ä) könnte ich es am besten Speichern?
Denn jedesmal wenn das Lied wechselt die XML Datei wieder zu öffnen und auszulesen währe ja sehr unperformant.

Grüße

tewes
 
Also ich hab das ganze in einem ähnlichen Anwendungsfall ebenfalls über eine XML Datei realisiert.

Schreib Dir einfach eine Klasse die die Liedinformationen speicherst und eine übergeordnete Klasse die eine Liste mit allen Liedern enthält.

Nutze dann einfach serialisieren um die XML Datei zu erzeugen bzw. auszulesen. Beim Programmstart kannst du dann einfach per Deserialize alle in der XML Datei enthaltenen Knoten laden und als Objekte direkt ansprechen.
 
Hab nochmal kurz ein Beispiel geschrieben. Funktioniert wirklich wunderbar einfach:

Die Klasse für die gesamte Playlist:

Code:
using System;
using System.Collections.Generic;
using System.Xml.Serialization;
using System.Text;

namespace WindowsApplication1
{
    [XmlRoot("Playlist")]
    public class Playlist
    {
        [XmlElement("Description")]
        public string description = "Playlist dingsbums";

        [XmlArrayItem(typeof(SongInfo))]
        public List<SongInfo> songInfoList = new List<SongInfo>();

        public Playlist() { }
    }
}

Die Klasse für Liedinformationen:

Code:
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;

namespace WindowsApplication1
{
    public class SongInfo
    {
        [XmlElement("Name")]
        public string name;
        [XmlElement("Pfadoderwasauchimmer")]
        public string path;

        public SongInfo() { }
        public SongInfo(string nameIn, string pathIn)
        {
            name = nameIn;
            path = pathIn;
        }
    }
}

Das Hauptprogramm:

Code:
public partial class Form1 : Form
    {
        Playlist myPlaylist = new Playlist();

        public Form1()
        {
            InitializeComponent();

            myPlaylist.songInfoList.Add(new SongInfo("Testsong1", "testpath1"));
            myPlaylist.songInfoList.Add(new SongInfo("Testsong2", "testpath2"));
            myPlaylist.songInfoList.Add(new SongInfo("Testsong3", "testpath3"));

            SerializeToXml();
        }

        private void SerializeToXml()
        {
            FileStream fs = new FileStream("YourXML.xml", FileMode.Create);
            try
            {
                XmlSerializer serializer = new XmlSerializer(typeof(Playlist));
                serializer.Serialize(fs, myPlaylist);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.InnerException.ToString());
            }

            fs.Dispose();
            fs.Close();

        }
        private void DeSerializeToXml()
        {
            FileStream fs = new FileStream("YourXML.xml", FileMode.Open);
            try
            {
                XmlSerializer serializer = new XmlSerializer(typeof(Playlist));
                myPlaylist = (Playlist)serializer.Deserialize(fs);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.InnerException.ToString());
            }

            fs.Dispose();
            fs.Close();

        }
    }


Natürlich müssen die Klassen noch Deinen Ansprüchen angepasst werden. Der Vorteil: Du musst Dich nicht um das Auslesen der XML kümmern. Über die DeSerialize Methode wird aus jedem Knoten ein Objekt erzeugt und in der Playlist angelegt. Damit kannst du auf jedes Element problemlos zugreifen.

Folgendermaßen sieht die XML dann aus:

<?xml version="1.0" ?>
- <Playlist xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Description>Playlist dingsbums</Description>
- <songInfoList>
- <SongInfo>
<Name>Testsong1</Name>
<Pfadoderwasauchimmer>testpath1</Pfadoderwasauchimmer>
</SongInfo>
- <SongInfo>
<Name>Testsong2</Name>
<Pfadoderwasauchimmer>testpath2</Pfadoderwasauchimmer>
</SongInfo>
- <SongInfo>
<Name>Testsong3</Name>
<Pfadoderwasauchimmer>testpath3</Pfadoderwasauchimmer>
</SongInfo>
</songInfoList>
</Playlist>
 
Besten dank euch beiden. Werde beide Arten in nächster Zeit test und dann gucken welche besser für meine Sprüche geeignet ist.

Grüße

tewes

//EDIT: Ich hab mich jetzt für die Klassen von Below entschieden.
Aber ich will die PlayList Klasse noch um das Interface Enumerable erweitern.
Da ich von Interfaces kaum Ahnung habe brauche ich dabei eure Hilfe.
Code:
[XmlRoot("Playlist")]
    public class Playlist :IEnumerable<int>
    {
        [XmlElement("Description")]
        public string description = "Playlist dingsbums";

        [XmlArrayItem(typeof(SongInfo))]
        public List<SongInfo> songInfoList = new List<SongInfo>();

        public Playlist() { }
        public void Add(string FileName, string Path)
        {
        }
        public IEnumerable<int> GetEnumerator()
        {
            return this.songInfoList.GetEnumerator();
        }
        public int Count 
        {
            get
            {
                return songInfoList.Count;
            }
            set
            {
                songInfoList.Count = value;
            }
        }
    }
Habe die Klasse bis jetzt so weit umgeändert. Aber ich bekomme immer den Fehler:
Error 1 'WinXMS.Playlist' does not implement interface member 'System.Collections.Generic.IEnumerable<int>.GetEnumerator()'. 'WinXMS.Playlist.GetEnumerator()' is either static, not public, or has the wrong return type. C:\Users\tewes\Documents\Visual Studio 2005\Projects\WinXMS\WinXMS\playlist.cs 10 18 WinXMS

Grüße

tewes
 
Zuletzt bearbeitet:
Was genau hast Du denn vor?

Ach und bevor ichs vergesse. Häufige Fehlerquellen:

- Serialisierungsklassen benötigen immer einen leeren Konstruktor
- Elemente die serialisiert werden sollen müssen public sein

Gruß below
 
Ich will das Interface IEnumerable implementieren um die PlayList mit einer Foreach schleife zu durchlaufen.
 
Ich verstehe Dein Problem gerad nicht. Du kannst doch die Playlist einfach mit

Code:
foreach(SongInfo in songInfoList)
{
    DoBlabla();
}
durchgehen.
 
Zurück
Oben