2012-05-30 5 views
6

ho una directory con 2 file:Configurazione searchPattern in EnumerateFiles

  • file1.xls
  • file2.xlsx

Se lo faccio:

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

Si sta tornando entrambi i file, e voglio solo il primo (file1.xls). Come posso fare questo?

Grazie!

risposta

9

Sembra che sotto il cofano, la classe DirectoryInfo utilizza la chiamata Win32 FindFirstFile.

Questo consente solo i caratteri jolly:

* per adattarsi a qualsiasi carattere

? per corrispondere 0 o più caratteri - vedi comments.

Pertanto si dovrà filtrare i risultati da soli, magari utilizzando il seguente:

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

Grazie. La tua risposta è stata completata – Pedre

0

è possibile utilizzare i metodi di estenzione IEnumerable.First(), IEnumerable.FirstOrDefault(), o se il modello è importante correggere il modello di ricerca dell'enumerazione.

+0

Prima o FirstOrDefault non è valido per me, perché se nella directory hanno file1.xls, file2.xlsx e file3.xls ho bisogno file1.xls e file3.xls L'altra opzione. Come posso correggere il mio pattern di ricerca di enumerazione? – Pedre

0

Qualcosa di simile a questo:

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

Grazie. Questo è ciò di cui avevo bisogno – Pedre

+0

Questo non viene compilato, anche se si include la variabile searchPattern nella chiamata EnumerateFiles. L'enumerabile è di tipo FileInfo (vedi la mia risposta). –

+0

Sì, ma questo esempio mi ha servito come base.Infine eseguo ExtensionsToSearch.SelectMany (pattern => directoryInfo.EnumerateFiles ("*." + Pattern, SearchOption.TopDirectoryOnly) .Where (fileInfo => Path.GetExtension (fileInfo.FullName) == "." + Pattern)) – Pedre

3

Questo è in realtà un comportamento previsto. È strano, ma è documentato.

Su MSDN possiamo leggere una frase:

Quando si utilizza il carattere jolly asterisco in un searchPattern, come ad esempio "* .txt", il comportamento di corrispondenza quando l'interno è esattamente tre caratteri è diverso da quello quando l'estensione è lunga più o meno di tre caratteri. Un searchPattern con un'estensione di file di esattamente tre caratteri restituisce file aventi un'estensione di tre o più caratteri, in cui i primi tre caratteri corrispondono all'estensione di file specificata in searchPattern. Un searchPattern con un'estensione di file di uno, due o più di tre caratteri restituisce solo i file con estensioni di esattamente quella lunghezza che corrispondono all'estensione di file specificata in searchPattern. Quando si utilizza il carattere jolly del punto interrogativo, questo metodo restituisce solo i file che corrispondono all'estensione del file specificata. Ad esempio, dati due file "file1.txt" e "file1.txtother", in una directory, un modello di ricerca di "file? .txt" restituisce solo il primo file, mentre un modello di ricerca di "file * .txt" restituisce entrambi i file.

Problemi correlati