Hallo zusammen,
ich habe momentan das Problem, dass ich gerne alle Dateien und Unterordner mit deren Dateien und Unterordnern in eine Liste packen möchte (die pfadnamen als strings ablegen).
Dabei gehe ich von folgendem Code aus:
try {
files = new List<string>();
folder = new List<string>();
System.IO.DirectoryInfo ParentDirectory = new System.IO.DirectoryInfo(
@choice.Text);
//MessageBox.Show("tetst","Debug");
foreach (System.IO.FileInfo f in ParentDirectory.GetFiles())
{
MessageBox.Show("Datei: " + @choice.Text + "\\" + f.Name,"Dateiname:");
files.Add(@choice.Text + "\\" +f.Name);
}
foreach (System.IO.DirectoryInfo d in ParentDirectory.GetDirectories())
{
MessageBox.Show("Ordner: " + @choice.Text + "\\" + d.Name,"Ordnername");
folder.Add(@choice.Text + "\\" + d.Name);
}
}catch (Exception ex){
MessageBox.Show(ex.ToString(),"Exception");
}
Dieser kann jedoch leider nur alle Dateien und alle Ordner in einem Verzeichnis auflisten. Es werden also keine weiteren Unterordner und deren Dateien berücksichtigt.
Habt ihr vielleicht eine Idee, wie ich den Code abändern könnte um mein Ziel zu erreichen?
Vielen Dank und viele Grüße Piep000r!
du musst die methode so anpassen, dass sie rekursiv läuft. dann werden auch alle unterordner berücksichtigt - sofern vorhanden.
Gruß
falls rekursiv zu kompliziert ist, gehts auch einfach, mit hilfe des frameworks:
DirectoryInfo di = new DirectoryInfo("C:\ExampleDir");
FileInfo[] files = di.GetFiles("*", SearchOption.AllDirectories);
"Wer mit künstlicher Intelligenz arbeitet, muß auch mit natürlicher Dummheit rechnen." - Klaus Kornwachs
Es funktioniert.
Habe das Framework benutzt.
Ich danke euch vielmals. =)
Es sieht nun so aus:
files = new List<string>();
folder = new List<string>();
int file_counter = 0;
int folder_counter = 0;
System.IO.DirectoryInfo ParentDirectory = new System.IO.DirectoryInfo(
@choice.Text);
DirectoryInfo di = new DirectoryInfo(@choice.Text);
foreach (var fn in di.GetFiles("*" ,SearchOption.AllDirectories)) {
files.Add(fn.ToString());
file_counter++;
}
MessageBox.Show("Es waren " + file_counter + " Dateien.","Debug");
foreach (var fn in di.GetDirectories("*" ,SearchOption.AllDirectories)) {
folder.Add(fn.ToString());
folder_counter++;
}
MessageBox.Show("Es waren " + folder_counter + " Ordner.","Debug");
}catch (Exception ex){
MessageBox.Show(ex.ToString(),"Exception");
}
Was jetzt natürlich noch brauchbar wäre, sind die vollen Pfade und nicht nur die Dateinamen.
Hallo Piep000r,
ich denke die Funktion aus .Net reicht zwar für Standardauflistung aus, jedoch wirft diese u.a. bei geschützten Dateien eine Exception, die das weiter Suchen unmöglich macht.
Das Snippet von herbivore umgeht dieses Problem, daher würde ich dir Raten jenes zu verwenden.
André
EnumerateFiles / EnumerateDirectories sind die neuen Methoden im Framework.
Sie sind schneller und werfen keine Exceptions. Am schnellsten wäre der Weg über die WinAPI / Shell, da hier keine (oft) unnötigen Informationen, wie bei der FileInfo-Klasse geladen werden.
@Piep000r: wie man den vollen Pfad der Rückgabe bekommt steht in der Dokumentation FileInfo-Class
Ein "file.ToString()" ist alles andere als empfehlenswert. Nicht umsonst stellt die Klasse Eigenschaften zur Verfügung.
Aber das ist hier ein Grundlagenthema [Hinweis] Wie poste ich richtig? 1.1.1 und grenzt auch schon an 1.1 und Punkte 4.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code