2012-05-30 15 views
6

ich ein Verzeichnis mit 2 Dateien haben:Konfiguration search in EnumerateFiles

  • file1.xls
  • file2.xlsx

Wenn ich tun:

directoryInfo.EnumerateFiles("*.xls", SearchOption.TopDirectoryOnly) 

Es kehrt zurück beide Dateien, und ich möchte nur die erste (file1.xls). Wie kann ich das machen?

Vielen Dank!

Antwort

9

Es ist wie unter der Haube aussieht, die DirectoryInfo Klasse verwendet die Win32-Aufruf FindFirstFile.

Dies ermöglicht nur die Platzhalter:

* jedes Zeichen

? entsprechen 0 oder mehr Zeichen übereinstimmen - siehe comments.

Deshalb haben Sie die Ergebnisse selbst filtern, vielleicht mit folgenden:

directoryInfo.EnumerateFiles("*.xls", SearchOption.TopDirectoryOnly) 
      .Where(fi => fi.Extension == ".xls"); 
+0

Danke. Ihre Antwort ist sehr abgeschlossen – Pedre

0

können Sie verwenden IEnumerable.First(), IEnumerable.FirstOrDefault() Erweiterung Methoden, oder wenn Muster wichtig ist, korrigieren Sie Ihre Enumeration Suchmuster.

+0

Erste oder FirstOrDefault ist für mich nicht gültig, denn wenn im Verzeichnis file1.xls haben, file2.xlsx und file3.xls ich file1.xls und file3.xls brauchen andere Option. Wie kann ich mein Aufzählungssuchmuster korrigieren? – Pedre

0

Etwas wie folgt aus:

directoryInfo.EnumerateFiles(".xls",SearchOption.TopDirectoryOnly) 
    .Where(f => Path.GetExtension(f) == ".xls"); 
+0

Danke. Dies ist, was ich brauchte – Pedre

+0

Das kompiliert nicht, auch wenn Sie die Variable searchPattern in den Aufruf von EnumerateFiles einschließen. Der Enumerable ist vom Typ FileInfo (siehe meine Antwort). –

+0

Ja, aber dieses Beispiel hat mir als Grundlage gedient.Schließlich mache ich ExtensionsToSearch.SelectMany (pattern => directoryInfo.EnumerateFiles ("*." + Muster, SearchOption.TopDirectoryOnly). Wo (fileInfo => Path.GetExtension (fileInfo.FullName) == "." + Muster)) – Pedre

3

Dies ist eigentlich ein erwartetes Verhalten ist. Es ist seltsam, aber es ist dokumentiert.

Auf MSDN wir eine Bemerkung lesen:

Wenn das Sternchen Platzhalter-Zeichen in einem search verwenden, wie zum Beispiel „* .txt“, das Übereinstimmungsverhalten, wenn die Erweiterung genau drei Zeichen lang ist anders als wenn die Erweiterung mehr oder weniger als drei Zeichen lang ist. Ein searchPattern mit einer Dateierweiterung von genau drei Zeichen gibt Dateien mit einer Erweiterung von drei oder mehr Zeichen zurück, wobei die ersten drei Zeichen mit der im searchPattern angegebenen Dateierweiterung übereinstimmen. Ein searchPattern mit einer Dateierweiterung von einem, zwei oder mehr als drei Zeichen gibt nur Dateien zurück, deren Erweiterungen exakt der Länge entsprechen, die mit der im searchPattern angegebenen Dateierweiterung übereinstimmt. Bei Verwendung des Fragezeichen-Platzhalterzeichens gibt diese Methode nur Dateien zurück, die der angegebenen Dateierweiterung entsprechen. Bei zwei Dateien, "file1.txt" und "file1.txtother", in einem Verzeichnis, gibt ein Suchmuster von "file? .txt" nur die erste Datei zurück, während ein Suchmuster von "file * .txt" gibt beide Dateien zurück.