none
C# | Unterordener Beziehen | Windows Forms

    Frage

  • Hallo,

    Ich Programmiere ein Programm für meine Musik anlage die von einem PC aus Gesteuert wird. Aktuell benutze ich nur einen OFD für das auslesen meiner Songs. Dieser speichert in mehrern String Arrays die Pfade, Song-Namen und die Index nummer in der ListBox.

    Mein Problem ist das, dass ich in meinem Ordener für meine Musk Unterordner habe, wegen der verschiedenen Alben, in denen die Songs sind. Ich möchte allerdings alle Songs in meiner ListBox angezeigt bekommen, ohne das ich jedes Album einzeln auswählen muss.

    MfG.

    Daniel S.

    Ich Danke im Voraus für alle Antworten.

    Freitag, 10. August 2018 19:47

Antworten

  • Hi,
    Stefans Beitrag sollte funktionieren. Hier mal eine Demo, wo mit Komma getrennte Dateitypen (Dateierweiterungen) eingegeben werden, nach denen dann gesucht wird. Die gefundenen Dateien werden in der Demo in einer ListBox angezeigt.

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.IO;
    using System.Linq;
    using System.Windows.Forms;
    
    namespace WindowsFormsApp1
    {
      public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
        }
    
        private TextBox tb = new TextBox() { Dock = DockStyle.Top, Text = "png,jpg" };
        private Button btn = new Button() { Dock = DockStyle.Top, Text = "Start" };
        private ListBox lb = new ListBox() { Dock = DockStyle.Fill };
    
        private void Form1_Load(object sender, EventArgs e)
        {
          this.Controls.AddRange(new Control[] { lb, btn, tb });
          btn.Click += Btn_Click;
        }
    
        private void Btn_Click(object sender, EventArgs e)
        {
          // Startverzeichnis
          string startDir = @"C:\Users";
          // Dateitypen (aus TextBox)
          string[] dateiTypen = tb.Text.Split(',');
          // Liste für gefundene Dateien
          List<string> dateiListe = new List<string>();
          // Dateinamen holen
          dirSearch(startDir, dateiListe, dateiTypen);
          // Dateinamen anzeigen
          lb.DataSource = dateiListe;
        }
    
        void dirSearch(string dir, List<string> liste, string[] typen)
        {
          try
          {
            var fileNames = from strFile in Directory.GetFiles(dir) where typen.Contains(Path.GetExtension(strFile).Substring(1)) select strFile;
            foreach (string strFile in fileNames) liste.Add(strFile);
            foreach (string strDirectory in Directory.GetDirectories(dir)) dirSearch(strDirectory, liste, typen);
          }
          catch (Exception ex) { liste.Add($"  *** Error: {dir} {ex.Message}"); }
        }
      }
    }
    


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    • Als Antwort markiert Lucky_001 Sonntag, 12. August 2018 14:11
    Samstag, 11. August 2018 19:32

Alle Antworten

  • Hallo Daniel,

    abgesehen davon, dass ich keine Frage erkennen kann: Warum machst Du es dir so kompliziert?

    Anstelle mehrerer String Arrays bietet sich hier doch eine List<T> oder änliches bestens an. T wäre dann in dem Fall eine Klasse, die die von dir gewünschten Eigenschaften zu den einzelnen Titeln bietet. Eine Hierarchie einzubauen wäre dann ebenfalls kein Problem, über entsprechende Methoden kannst Du dann auch eine "flache" Liste aller Elemente aus allen Hierarchieebenen abrufen, um die in einem Control anzuzeigen.

    public class Album
    {
        public int ID { get; set; }
        public String Name { get; set; }
        public List<Song> Songs { get; set; }
    }
    
    public class Song
    {
        public int ID { get; set; }
        public Album Album { get; set; }
        public String Name { get; set; }
    }
    
    ...
    
    List<Album> albums = new List<Album>();
    
    foreach ...
    {
        Album album = new Album() { ID = 1, Name = "Album 1" };
        albums.Add( album };
    
        List<Song> songs = new List<Song>();
        songs.Add( new Song() { ID = 1, Album = album, Name = "Song 1" };
        songs.Add( new Song() { ID = 2, Album = album, Name = "Song 2" };
    }
    
    ...


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Freitag, 10. August 2018 21:21
    Moderator
  • Hi, wenn die Frage ist, wie man Verzeichnisse inkl. Unterverzeichnisse durchsucht, ist dein Suchbegriff "rekursiv".

    Du könntest so etwas machen:

    void dirSearch(string strDir)
    {
    	try
    	{
    		foreach (string strFile in Directory.GetFiles(strDir))
    		{
    			//mach was..
    		}
    
    		foreach (string strDirectory in Directory.GetDirectories(strDir))
    		{
    			dirSearch(strDirectory);
    		}
    	}
    	catch (Exception ex)
    	{
    		Console.WriteLine(ex.Message);
    	}
    }

    Möchte mich aber den Stefan Falz anschließen, mit "mehreren Arrays" wird das ganze nicht übersichtlich.

    Gruß


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Samstag, 11. August 2018 09:27
  • Danke,

    Ich werde es gleich ausprobieren. Wusste nicht das es auch so geht.

    Samstag, 11. August 2018 10:04
  • Leider ist es nicht das was ich suche. Ich möchte gerne Unterordner nach Dateitypen durchsuchen ohne zu wissen zu müssen wie der Unterordner Heißt.
    Samstag, 11. August 2018 16:51
  • Hi,

    nuja, das geht bspw. über:

    System.IO.Directory.GetFiles( "<Pfad>", "*.mp3", SearchOption.AllDirectories )

    Siehe dazu:

      Directory.GetFiles-Methode: (String, String, SearchOption)

    Aber Stefan Krömers Antwort funktioniert ebenfalls ohne das man die Namen der Unterordner wissen müsste.

    Evtl. probierst Du es einfach mal wie von uns geschrieben, ich wüsste jetzt nicht, was da nicht klappen soll.

    Falls Du noch auf Probleme triffst, beschreib die bitte genau, poste deinen Code und falls Du eine Fehlermeldung erhältst, auch diese (exakt und vollständig).

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    Samstag, 11. August 2018 18:38
    Moderator
  • Ich verstehe dich nicht. "dirSearch" durchsucht ein Verzeichnis mit sämtlichen Unterverzeichnissen.

    Wenn du nach einen bestimmten Dateityp suchst, kannst du doch ein searchPattern nutzen:

    private static void dirSearch(string strDir)
    {
    	try
    	{
    		foreach (string strFile in Directory.GetFiles(strDir, "*.mp3"))
    		{
    			//mach was..
    			Console.WriteLine(strFile);
    		}
    
    		foreach (string strDirectory in Directory.GetDirectories(strDir))
    		{
    			dirSearch(strDirectory);
    		}
    	}
    	catch (Exception ex)
    	{
    		Console.WriteLine(ex.Message);
    	}
    }

    Oder du machst es zum Beispiel so:

    var files = Directory.EnumerateFiles(@"C:\Users\admin\OneDrive\Musik", "*.*", SearchOption.AllDirectories).Where(f => f.ToLower().EndsWith(".mp3") || f.ToLower().EndsWith(".m4a"));
    foreach (var f in files)
    {
    	Console.WriteLine(f);
    }

    Wenn du etwas anderes brauchst, musst du es genauer beschreiben...

    Gruß


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Samstag, 11. August 2018 18:39
  • Hi,
    Stefans Beitrag sollte funktionieren. Hier mal eine Demo, wo mit Komma getrennte Dateitypen (Dateierweiterungen) eingegeben werden, nach denen dann gesucht wird. Die gefundenen Dateien werden in der Demo in einer ListBox angezeigt.

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.IO;
    using System.Linq;
    using System.Windows.Forms;
    
    namespace WindowsFormsApp1
    {
      public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
        }
    
        private TextBox tb = new TextBox() { Dock = DockStyle.Top, Text = "png,jpg" };
        private Button btn = new Button() { Dock = DockStyle.Top, Text = "Start" };
        private ListBox lb = new ListBox() { Dock = DockStyle.Fill };
    
        private void Form1_Load(object sender, EventArgs e)
        {
          this.Controls.AddRange(new Control[] { lb, btn, tb });
          btn.Click += Btn_Click;
        }
    
        private void Btn_Click(object sender, EventArgs e)
        {
          // Startverzeichnis
          string startDir = @"C:\Users";
          // Dateitypen (aus TextBox)
          string[] dateiTypen = tb.Text.Split(',');
          // Liste für gefundene Dateien
          List<string> dateiListe = new List<string>();
          // Dateinamen holen
          dirSearch(startDir, dateiListe, dateiTypen);
          // Dateinamen anzeigen
          lb.DataSource = dateiListe;
        }
    
        void dirSearch(string dir, List<string> liste, string[] typen)
        {
          try
          {
            var fileNames = from strFile in Directory.GetFiles(dir) where typen.Contains(Path.GetExtension(strFile).Substring(1)) select strFile;
            foreach (string strFile in fileNames) liste.Add(strFile);
            foreach (string strDirectory in Directory.GetDirectories(dir)) dirSearch(strDirectory, liste, typen);
          }
          catch (Exception ex) { liste.Add($"  *** Error: {dir} {ex.Message}"); }
        }
      }
    }
    


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    • Als Antwort markiert Lucky_001 Sonntag, 12. August 2018 14:11
    Samstag, 11. August 2018 19:32
  • Danke, Habe das andere nur nicht richtig verstanden gehabt. Aber jetzt habe ich es kappiert. Es sehr hilfreich und genau das was ich suche

    Sonntag, 12. August 2018 14:11