Ich möchte einen Treeview erstellen, der alle Ordner im System anzeigt und nur Musikdateien wie z. B. .mp3 .aiff .wav etc. anzeigt.
Ich erinnere mich daran, gelesen zu haben, dass ich eine rekursive Funktion oder etwas in dieser Art verwenden muss.
Ich möchte einen Treeview erstellen, der alle Ordner im System anzeigt und nur Musikdateien wie z. B. .mp3 .aiff .wav etc. anzeigt.
Ich erinnere mich daran, gelesen zu haben, dass ich eine rekursive Funktion oder etwas in dieser Art verwenden muss.
Normalerweise haben die meisten Computer Tausende von Ordnern und Hunderttausende von Dateien, daher wäre es sehr langsam und würde viel Speicher verbrauchen, wenn alle von ihnen rekursiv in einem TreeView angezeigt werden. Sehen Sie sich meine Antwort in dieser Frage an und zitieren Sie meine Antwort mit einigen Modifikationen, um eine ziemlich brauchbare GUI zu erhalten:
// Behandle das BeforeExpand-Ereignis
private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
{
if (e.Node.Tag != null) {
AddDirectoriesAndMusicFiles(e.Node, (string)e.Node.Tag);
}
}
private void AddDirectoriesAndMusicFiles(TreeNode node, string path)
{
node.Nodes.Clear(); // Löschen des Dummy-Knotens, wenn vorhanden
try {
DirectoryInfo currentDir = new DirectoryInfo(path);
DirectoryInfo[] subdirs = currentDir.GetDirectories();
foreach (DirectoryInfo subdir in subdirs) {
TreeNode child = new TreeNode(subdir.Name);
child.Tag = subdir.FullName; // Vollständigen Pfad im Tag speichern
// TODO: Verwenden Sie ein Bild für den Knoten, um anzuzeigen, dass es sich um eine Musikdatei handelt
child.Nodes.Add(new TreeNode()); // Dummy-Knoten hinzufügen, um eine Erweiterung zu ermöglichen
node.Nodes.Add(child);
}
List files = new List();
files.AddRange(currentDir.GetFiles("*.mp3"));
files.AddRange(currentDir.GetFiles("*.aiff"));
files.AddRange(currentDir.GetFiles("*.wav")); // usw.
foreach (FileInfo file in files) {
TreeNode child = new TreeNode(file.Name);
// TODO: Verwenden Sie ein Bild für den Knoten, um anzuzeigen, dass es sich um eine Musikdatei handelt
child.Tag = file; // Vollständigen Pfad für spätere Verwendung speichern
node.Nodes.Add(child);
}
} catch { // Versuchen, mit jeder Ausnahme separat umzugehen
} finally {
node.Tag = null; // Tag löschen
}
}
private void MainForm_Load(object sender, EventArgs e)
{
foreach (DriveInfo d in DriveInfo.GetDrives()) {
TreeNode root = new TreeNode(d.Name);
root.Tag = d.Name; // für spätere Referenz
// TODO: Verwenden Sie ein Laufwerksbild für den Knoten
root.Nodes.Add(new TreeNode()); // Dummy-Knoten hinzufügen, um eine Erweiterung zu ermöglichen
treeView1.Nodes.Add(root);
}
}
Die rekursive Suche nach bestimmten Dateien auf allen Laufwerken wird nicht gut funktionieren. Es wird etwa eine Minute dauern, dies mit den heutigen großen Laufwerken zu tun.
Ein gängiger Trick, den Windows Explorer verwendet, besteht darin, nur die Top-Level-Verzeichnisse und Dateien aufzulisten. Es fügt ein Dummy-Knoten in einen Verzeichnisknoten ein. Wenn der Benutzer den Knoten öffnet (BeforeExpand-Ereignis), durchsucht er nur dieses Verzeichnis und ersetzt den Dummy-Knoten durch die in diesem Verzeichnis gefundenen Verzeichnisse und Dateien. Er fügt wiederum einen Dummy-Knoten in die Verzeichnisse ein. usw.
Sie können dies in Aktion sehen, indem Sie ein leeres Unterverzeichnis hinzufügen. Der Verzeichnisknoten wird mit dem + - Glyphen angezeigt. Wenn Sie es öffnen, entdeckt der Explorer, dass keine Verzeichnisse oder Dateien aufgelistet werden müssen, und löscht den Dummy-Knoten. Das + - Glyphen verschwindet.
Dies ist sehr schnell, das Auflisten des Inhalts eines einzelnen Verzeichnisses dauert deutlich weniger als eine Sekunde. Es gibt jedoch ein Problem bei der Verwendung dieses Ansatzes in Ihrem Fall. Die Wahrscheinlichkeit, dass ein Verzeichnis eine geeignete Musikdatei enthält, ist gering. Der Benutzer wird ständig frustriert sein, wenn er feststellt, dass das Navigieren durch eine Reihe von Unterverzeichnissen nichts produziert.
Deshalb hat Windows einen dedizierten Ort zum Speichern bestimmter Mediendateien. In diesem Fall Mein Musik. Verwenden Sie Environment.GetFolderPath (Environment.SpecialFolder.MyMusic), um es zu finden. Das Durchlaufen sollte nicht lange dauern.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.