Ich verwende rekursiv DirectoryInfo.GetDirectories()
, um alle Unterverzeichnisse unter einem bestimmten Pfad zu finden. Ich möchte jedoch die Systemordner ausschließen und es gibt keinen klaren Weg dafür. In FindFirstFile/FindNextFile waren die Dinge klarer mit den Attributen.DirectoryInfo.GetDirectories() und Attribute
Antwort
@rslite ist richtig, .NET nicht eine solche Filterung out-of-box nicht geben, aber es ist nicht schwer zu implementieren:
static IEnumerable<string> GetNonSystemDirs(string path)
{
var dirs = from d in Directory.GetDirectories(path)
let inf = new DirectoryInfo(d)
where (inf.Attributes & FileAttributes.System) == 0
select d;
foreach (var dir in dirs)
{
yield return dir;
foreach (var subDir in GetNonSystemDirs(dir))
{
yield return subDir;
}
}
}
MSDN Links:
Sie müssten wahrscheinlich die Ergebnisse durchlaufen und diejenigen mit den Attributen ablehnen, die Sie nicht möchten (verwenden Sie die Attributes-Eigenschaft).
Dies ist ein großartiges Beispiel für ein Szenario, in dem Linq und Extension-Methoden die Dinge wirklich sauber und einfach machen.
public static DirectoryInfo[] GetNonSystemDirectories(
this DirectoryInfo directory,
string searchPattern,
SearchOption searchOption)
{
return directory.GetDirectories(searchPattern, searchOption)
.Where(subDir => (subDir.Attributes & FileAttributes.System) == 0)
.ToArray();
}
Wenn Sie eine .net v2 Anwendung Gebäude sind, dann können Sie LinqBridge verwenden Sie alle kühlen Linq zu Objekten Methoden zugreifen zu geben (wie Wo() und ToArray() oben).
bearbeiten
In .net v4 Sie EnumerateDirectories statt GetDirectories verwenden würde, die Sie zum ersten Mal im Speicher ohne den Aufbau einer Anordnung über die Ergebnisse iterieren ermöglicht.
public static IEnumerable<DirectoryInfo> EnumerateNonSystemDirectories(
this DirectoryInfo directory,
string searchPattern,
SearchOption searchOption)
{
return directory.EnumerateDirectories(searchPattern, searchOption)
.Where(subDir => (subDir.Attributes & FileAttributes.System) == 0);
}
Mit der ultimative Süße Linq
IEnumerable<string> directories = new DirectoryInfo(path).GetDirectories().Where(a => (a.Attributes & FileAttributes.System) == 0).Select(a => a.FullName);
- 1. Ist das ein Fehler in DirectoryInfo.GetDirectories (string searchPattern)?
- 2. XML-Namespaces und Attribute
- 3. Polymorphismus und verschachtelte Attribute
- 4. HTML - Attribute und Eigenschaften
- 5. XmlSerializer und nullable Attribute
- 6. Scala XML Mustererkennung und Attribute
- 7. PHP Soapclient und Lesen Attribute
- 8. MEF Benutzerdefinierte Attribute und Lazy
- 9. Rails: Virtuelle Attribute und Formularwerte
- 10. C# Attribute und ihre Verwendung
- 11. XPages Thema und Dojo-Attribute
- 12. DllImport - PreserverSig und SetLastError Attribute
- 13. XML geschachtelte Attribute und XSD.exe
- 14. Statische Attribute (Python und Java)
- 15. XHTML-Validierung, benutzerdefinierte Namespaces und Attribute
- 16. Type Hinting und optionale Attribute in PHP
- 17. nillable und minOccurs XSD Element Attribute
- 18. Fortran Compiler Terminologie: Dummy-Variablen und Attribute
- 19. Sortieren divs mit Daten-Attribute und Javascript
- 20. Readxml verwendet Attribute als Spaltennamen und Werte
- 21. mappedBy und inverse Attribute sind gleich?
- 22. Get XmlElement inneren Text und Attribute
- 23. Erstellen von Attributgruppen und Attribute programmatisch
- 24. Sortieren nach Attribute und randomisieren rezidivierende
- 25. Benutzerdefinierte JSP TLD beiden Attribute und Elemente
- 26. Verkettung von Aggregatfunktion und String-Attribute
- 27. Ruby: Namenskonvention für Boolesche Attribute und Verwendung
- 28. Reflexion, Eigenschaften und Attribute - Studieren ORM-Architektur
- 29. Schienen - Attribute anhängen und zum Array hinzufügen
- 30. Dynamische Attribute mit Rails und Mongoid
Directory.GetDirectories Strings zurückgibt, wie Sie Attribute von ihm bekommen haben? :) – aku
@aku Ich verwende die DirectoryInfo.GetDirectories Instanz Methode, nicht die Directory.GetDirectories statische. –
Nicht so effizient/benutzbar wie die Erstellung eines echten rekursiven Iterators mit Rendite. Auf großen Verzeichnishierarchien mit SearchOption.AllDirectories ist nicht so gut. – Ash