C# Lösche Ordner mit einem @ Davor

...komplette Frage anzeigen

2 Antworten

 foreach (var pfad in Directory.EnumerateDirectories(@"c:\xxxxxxxxx").Where(x => Path.GetFileName(x).StartsWith("@")))
                Directory.Delete(pfad);

Das löscht die entsprechenden Pfade, die mit einem '@' beginnen.

Hallo,

Vielen dank! Es hat geklappt!

0

In diesem speziellen Fall würde ich sicherheitshalber GetDirectories() verwenden anstelle von EnumerateDirectories(). Die Enumerate-Variante ermittelt das nächste Element erst dann wenn es benötigt wird. Das kann zu Problemen führen, da die Aktion in der foreach die Aufzählung ändert, genauer gesagt zu einer Exception: "Die Auflistung wurde geändert. Der Enumerationsvorgang kann möglicherweise nicht ausgeführt werden."

Daher sollte man, wenn man eine Aufzählung ändern möchte immer zuerst den Lesevorgang beenden. Und das geht mit GetDierctories(), weil das sämtliche Elemente ermittelt und in einen string Array speichert, der vom Enumerator unabhängig ist (eine Kopie der Elemente)

0
@FaronWeissAlles

Das Problem kann ich nicht erkennen. Eben gerade wenn zwischenzeitlich ein anderes Verzeichnis gelöscht wurde, wäre EnumerateDirectories besser, weil ich die Prüfung auf Löschung nach dem Einlesen nicht erneut übernehmen muss. Es wird das nächst verfügbare Verzeichnis eingelesen. Wenn ich dagegen über GetDirectories() erst abwarten muss, bis alle Verzeichnisse eingelesen sind (nehmen wir den schlimmsten Fall an, dass ich die max. mögliche Anzahl von Verzeichnissen auf dem OS einlese!!), dann müsste ich eben auch vor jedem Löschen prüfen, ob das Verzeichnis noch existiert.

http://msdn.microsoft.com/de-de/library/dd383304(v=vs.110).aspx:

The EnumerateDirectories and GetDirectories methods differ as follows: When you use EnumerateDirectories, you can start enumerating the collection of names before the whole collection is returned; when you use GetDirectories, you must wait for the whole array of names to be returned before you can access the array. Therefore, when you are working with many files and directories, EnumerateDirectories can be more efficient.

The returned collection is not cached; each call to the GetEnumerator on the collection will start a new enumeration.

Und unter der Rubrik "Exception" ist eben der von Dir beschriebene Fehler nicht aufgeführt. Wir reden in diesem Fall auch nicht von verschachtelten (Sub)Ordnern.

0
@Michael339

Ich hab's mal getestet. Der Fehler tritt in der Tat auf, tritt aber auch bei GetDirectories() auf, wenn man erst alle Ordner in eine List/Array einliest... macht also keinen Unterschied. In beiden Fällen halt vor dem Löschen prüfen, ob der Ordner noch existiert. Daher unproblematisch.

0

Ich weiß nicht, wie man Ordner löscht, aber in Java testet man einen String auf seinen Anfang mit

myString.startsWith("@");

Das gibt dir einen Wahrheitswert zurück. Müsste bei C# ähnlich sein.

Ich danke dir schon einmal für diese Antwort, Ich werde eine Vergleich weise andere Variante für C# Googlen.

Danke dir,

Aliee

0

Was möchtest Du wissen?