Mehr von Jürgen Gutsch

Mehr von Jürgen Gutsch

Empfehlungen von Jürgen Gutsch

Blog-Empfehlungen von Jürgen Gutsch

Willkommen bei ASP.NET Zone. Anmelden | Registrieren | Hilfe

Jürgen Gutsch

ASP.NET und mehr...
Nützliches in .NET 4.0

Eben bin ich auf interessante Neuerungen der System.IO.Directory Klasse im .NET 4.0 gestoßen. Wenn man bisher alle Dateien und/oder alle Ordner eines übergeordneten Ordners erhalten wollte, konnte man das mit den statischen Methoden:

Man kann das auch in .NET 4.0 immer noch tun und erhält ein String-Array mit den gewünschten Einträgen.

Neu sind unter anderem folgende drei statischen Methoden:

Alle drei Methoden und deren Überladungen geben ein generisches IEnumerable vom Typ String zurück.

MSDN (Directory.EnumerateFiles-Methode (String))
Die EnumerateFiles-Methode und die GetFiles-Methode unterscheiden sich wie folgt: Wenn Sie EnumerateFiles verwenden, können Sie anfangen, die Auflistung von Namen aufzulisten, bevor die ganze Auflistung zurückgegeben wird; wenn Sie GetFiles verwenden, müssen Sie warten, bis das ganze Array von Namen zurückgegeben wird, bevor Sie auf das Array zugreifen können.Wenn Sie daher mit vielen Dateien und Verzeichnissen arbeiten, kann EnumerateFiles effizienter sein.

Das heißt konkret, die Verarbeitung der Daten kann gestartet werden, bevor alle Daten geladen sind. Die ideale Voraussetzung für LINQ:

IEnumerable<string> files =
  from file in Directory.EnumerateFiles("C:\\documents\\folder1\\")
  where file.EndsWith("*.docx", StringComparison.OrdinalIgnoreCase)
  select file;
foreach (string file in files)
{
  Console.WriteLine(file);
}

Einziger Kritikpunkt ist, dass kein FileInfo-, bzw. kein DirectoryInfo-Objekt zurückgegeben wird. Aber das kann man auch schnell selber erledigen:

IEnumerable<FileInfo> files =
  from file in Directory.EnumerateFiles("C:\\documents\\folder1\\")
  where file.EndsWith("*.docx", StringComparison.OrdinalIgnoreCase)
  select new FileInfo(file);
foreach (FileInfo file in files)
{
  Console.WriteLine(file.Name);
}

DotNetKicks-DE Image
Posted: Dienstag, 27. April 2010 10:21 von Jürgen Gutsch

Kommentare

Peter Bucher sagte:

Salute Jürgen

Danke für den Tipp :)

Die ganze Geschichte nützt aber nur was, wenn du ohne vorherige Abfrage durchiterierst. Ansonsten muss zuerst alles geladen werden, da keine verzögerte Ausführung.

# Mai 9, 2010 12:36

Jürgen Gutsch sagte:

Hallo Peter,

ich würde ganz klar sagen: "jein" ;-) Wenn die Rückgabe der Abfrage IEnumerabel und du noch kein Count(), ToList(), etc. gemacht hast, also die Abfrage noch nicht ausgeführt hast, kannst Du das IEnumerable auch später durchiterieren.

# Mai 10, 2010 08:33
Anonyme Kommentare sind nicht zugelassen