Directory.EnumerateFiles = & gt; UnauthorizedAccessException
Gibt es eine schöne neue Methode .NET 4.0, um Dateien in einem Verzeichnis in eine streaming-Möglichkeit via enumeration.
Das problem hier ist, dass, wenn man wünscht zum auflisten aller Dateien kann man nicht im Voraus wissen, welche Dateien oder Ordner Zugriff geschützt und kann werfen eine UnauthorizedAccessException.
Zu reproduzieren, kann man nur ausführen dieses fragment:
foreach (var file in Directory.EnumerateFiles(@"c:\", "*", SearchOption.AllDirectories))
{
//whatever
}
Bevor diese .NETTO-Methode existierte, war es möglich, zu erreichen in etwa die gleiche Wirkung durch die Implementierung einer rekursiven iterator, der auf das string-array zurückgeben von Methoden. Aber es ist nicht ganz so faul wie die neuen .NETTO-Methode ist.
Also, was ist zu tun? Kann die UnauthorizedAccessException unterdrückt werden oder ist eine Tatsache des Lebens, wenn mit dieser Methode?
Scheint mir, dass die Methode sollte eine überlastung haben Sie eine Aktion zum Umgang mit Ausnahmen.
InformationsquelleAutor der Frage Bent Rasmussen | 2011-02-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ths Problem mit der obigen Antwort ist, dass Sie nicht kümmern sich um die Ausnahme in der sub-Verzeichnisse. Dies wäre ein besserer Weg, um die Handhabung der Ausnahmen, so bekommen Sie ALLE Dateien aus ALLEN Unterverzeichnissen mit Ausnahme derjenigen, warf einen Zugang Ausnahme:
InformationsquelleAutor der Antwort MCE Buddy
Hätte ich nicht die oben zu arbeiten, aber hier ist meine Umsetzung, ich habe es getestet auf c:\users auf einem "Win7" - box, denn wenn alle diese "bösen" dirs:
Klasse:
InformationsquelleAutor der Antwort strudso
Verstehe ich, dass es
MoveNext
wirft die Ausnahme.Versuchte ich zu schreiben, eine Methode, die sicher-geht eine Sequenz und versucht, Sie zu ignorieren
MoveNext
Ausnahmen. Aber ich bin mir nicht sicher, obMoveNext
Fortschritte position, wenn es eine exception wirft, so könnte dies als unendlich-Schleife. Es ist auch eine schlechte Idee, weil wir uns verlassen würde, auf Einzelheiten der Implementierung.Aber es ist nur so viel Spaß!
Wird dies nur funktionieren, wenn die folgenden Bedingungen erfüllt sind über das framework die Umsetzung des iterator (siehe
FileSystemEnumerableIterator<TSource>
im Reflektor für Referenz):MoveNext
Fortschritten seiner position, wenn es scheitert;MoveNext
scheitert am letzten element ist, sind nachfolgende Aufrufe zurückfalse
statt eine Ausnahme zu werfen;Selbst wenn es funktioniert, bitte verwenden Sie Sie nie in Produktion!
Aber ich Frage mich wirklich, ob es existiert.
InformationsquelleAutor der Antwort Dan Abramov
Basierend auf strudso Antwort, aber als extension-Methoden für die beiden
FileInfo
undDirectoryInfo
.InformationsquelleAutor der Antwort Fowl
Ich bin zu spät, aber ich schlage vor, mit beobachtbaren Muster statt:
InformationsquelleAutor der Antwort Andreas Zita