Hallo liebe Community,
Meine Frage ist folgende, ich bekomme es nicht hin, dass ich bei einem rekursiven Durchlauf der Ordner, einen bestimmten Ordner, den der User vorher angegeben hat, auszulassen.
also als Beispiel:
der User gibt an, dass der Ordner Musik nicht durchlaufen werden soll, dieser Order Musik hat aber 10 Unter-Ordnern, dann macht das Programm, dass schon richtig, dass er die Daten im Ordner Musik nicht anfasst, aber leider die Daten in den Unter-Ordnern.
ich will, dass er dann auch die Unterordner auslässt und nicht nur den Ordner Musik.
Er soll dann beim nächsten Ordner, auf der gleichen ebene weiter machen.
Ich weiß nicht wie ich ihm sagen kann, dass er auch die unter Ordner auslassen soll für das angegeben Verzeichnis vom User.
Danke euch und hoffe auf eine Antwort.
ich habe leider für mein Problem keine Lösung hier finden können, oder habe es nicht geschafft das richtige zu finden.
Ich habe das in diesem Bereich gepostet, da ich das ganze in einer Windows Form Anwendung Programmiere.
[Tutorial] Bäume durchlaufen mit Rekursion (und Alternativen)
Hinzu kommt dann eben noch eine Abfrage auf den Ordnername, der exkludiert werden soll.
Den dann einfach zB. mit continue
überspringen.
Den Ansatz haste ja; aber mehr ohne den Code zu sehen kann ich jetzt nicht helfen.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
[Snippet] Verzeichnisse und Dateien rekursiv durchlaufen
kannst du auch mal anschauen.
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
Ich hatte beide von euch geschickten Links durchgeschaut, aber irgendwie nicht verstanden, wie ich das jetzt handhaben soll.
Mein Code ist folgender
foreach (string d in Directory.GetDirectories(SucherPfad))
{
if (d != Pfadauslassen)
{
try
{
foreach (string f in Directory.GetFiles(d, "*.*", SearchOption.AllDirectories).Where(s => Formatendungen.Contains(Path.GetExtension(s).ToLower())))
{
if (Path.GetDirectoryName(f) != Pfadauslassen)
{
//MessageBox.Show(f);
if (File.Exists(Speicherpfad + "\\" + Path.GetFileName(f)))
{
// i++;
doppelteTitel.Add(f);
//doppelteTitel[i] = f;
// MessageBox.Show(String.Format("Die Datei {0} existiert bereits und wurde übersprungen", f));
}
else
File.Copy(f, Speicherpfad + "\\" + Path.GetFileName(f));
}
//lstFilesFound.Items.Add(f);
}
//DirSearch(d);
}
catch (System.Exception excpt2)
{
MessageBox.Show(excpt2.Message);
}
}
else
{
MessageBox.Show("er ist in den Else Zweig gegangen");
}
Aus meiner Sicht sollte es so funktionieren, wie du es dir vorstellst.
Du durchläufst ja nur die Ordner auf einer Ebene, hast dann ein Ausschlusskriterium für einen Ordner.
Greift das nicht, werden alle Dateien des Ordners und der Unterordner kopiert (wenn sie nicht schon kopiert worden sind).
Dein zweites if
if (Path.GetDirectoryName(f) != Pfadauslassen)
ist mMn überflüssig.
@Pille, wie mache ich es dann jetzt richtig?
du hattest nicht geschrieben, wie es richtig funktionieren könnte, oder habe ich was verpasst 😄
Was funktioniert an deinen Code nicht?
Ich meinte damit, dass dein Code aus meiner Sicht richtig ist (ohne das jetzt selbst einmal laufen zu lassen).
ja ich habe doch geschildert, was mich daran stört. Er läuft ja auch 😄
aber was mich stört ist, dass ich zwar sagen kann, dass er den einen Ordern auslassen soll, aber ich will auch das alle unter Ordner von dem ausgewählten Order ausgelassen werden, wie ist das möglich, wenn das nicht geht, wäre ich auch dankbar, für eine Idee, wie der User mehrere Ordner auswählen kann, sprich mit markieren und ich die in einer LIST? eventuell abfragen kann um diese dann nicht durch zu laufen.
Gruß
JB
Hinzu kommt dann eben noch eine Abfrage auf den Ordnername, der exkludiert werden soll.
Den dann einfach zB. mitcontinue
überspringen..
Was ist daran das Problem? Die Unterordner? Kannst ja das Parent oder alle Parents abfragen und dementsprechend reagieren. Oder du exkludierst erst alle Ordner auf Top-Level, die du nicht willst und holst dir dann alle übrigen mit Unterordnern.
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
Nochmal: Dein Code funktioniert genau so, wie du es dir vorstellst!
Mit
Directory.GetDirectories(string path)
werden KEINE Unterordner eingelesen, nur die Ordner auf der Ebene des Pfades.
Mit
if (d != Pfadauslassen)
lässt du dann einen speziellen Ordner aus.
Die Dateien aus den Unterordnern werden erst bei
Directory.GetFiles(d, "*.*", SearchOption.[B]AllDirectories[/B])
berücksichtigt. Im Fall des ausgelassenen Ordners kommt er aber gar nicht an diese Stelle.
EDIT: In deinem ersten Beitrag schreibst du etwas von "rekursiv" - du hast in dem geposteten Code keinerlei Rekursion. Also entweder fehlt etwas oder wir reden aneinander vorbei.