Laden...

Dateisystem durchsuchen

Erstellt von Piep000r vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.497 Views
Thema geschlossen
P
Piep000r Themenstarter:in
11 Beiträge seit 2012
vor 11 Jahren
Dateisystem durchsuchen

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!

E
180 Beiträge seit 2010
vor 11 Jahren
Rekursion

du musst die methode so anpassen, dass sie rekursiv läuft. dann werden auch alle unterordner berücksichtigt - sofern vorhanden.

Gruß

2.891 Beiträge seit 2004
vor 11 Jahren
26 Beiträge seit 2011
vor 11 Jahren

falls rekursiv zu kompliziert ist, gehts auch einfach, mit hilfe des frameworks:



DirectoryInfo di = new DirectoryInfo("C:\ExampleDir");
FileInfo[] files = di.GetFiles("*", SearchOption.AllDirectories);


MSDN-Link

"Wer mit künstlicher Intelligenz arbeitet, muß auch mit natürlicher Dummheit rechnen." - Klaus Kornwachs

P
Piep000r Themenstarter:in
11 Beiträge seit 2012
vor 11 Jahren

Es funktioniert.
Habe das Framework benutzt.

Ich danke euch vielmals. =)

P
Piep000r Themenstarter:in
11 Beiträge seit 2012
vor 11 Jahren

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.

Z
403 Beiträge seit 2007
vor 11 Jahren

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é

16.834 Beiträge seit 2008
vor 11 Jahren

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.

Thema geschlossen