2010-09-23 22 views

Répondre

3

ce ne est pas possible de spécifier plusieurs filtres dans d'appel de méthode GetFiles unique(). Vous pouvez trouver des alternatives here

1

vous pouvez essayer quelque chose comme ceci:

var query = from p in Directory.GetFiles(@"C:\").AsEnumerable() 
        where p.Contains(".c") 
        || p.Contains(".h") 
        select p; 
+0

Aucune raison d'appeler AsEnumerable ici. GetFiles aura déjà rempli le tableau entier. – Josh

5

Si vous utilisez .NET 4.0, je partirais avec Directory.EnumerateFiles:

var files = from f in Directory.EnumerateFiles("C:\\") 
      where f.EndsWith(".c") || f.EndsWith(".h") 
      select f; 
+0

Seulement .Net 3.5 :) – Yuriy

+0

@Yuriy: La seule chose. NET 4.0 est l'utilisation de 'Directory.EnumerateFiles()'. Changez-le en 'Directory.GetFiles()' et cela devrait fonctionner aussi bien. –

+0

@Jeff M: Je peux me tromper, mais je suis certain que @Yuriy veut éviter d'appeler 'GetFiles()' pour éviter le coût de remplissage d'un tableau (potentiellement) énorme 'string []'. –

0

Voici quelques fonctions d'aide utiles pour simuler ayant plusieurs filtres:

// .NET 4.0 friendly 
public static IEnumerable<string> EnumerateFiles(string path, params string[] filters) 
{ 
    return filters.Length == 0 
     ? Directory.EnumerateFiles(path) 
     : filters.SelectMany(filter => Directory.EnumerateFiles(path, filter)); 
} 

// .NET 3.5 friendly 
public static IEnumerable<string> GetFiles(string path, params string[] filters) 
{ 
    return filters.Length == 0 
     ? Directory.GetFiles(path) 
     : filters.SelectMany(filter => Directory.GetFiles(path, filter)); 
} 
0

Pour .Net 3.5.

public IEnumerable<string> GetFiles(
    string basePath, 
    params string[] searchPatterns) 
{ 
    if (searchPatterns == null || searchPatterns.Length == 0) 
    { 
     return Directory.GetFiles(basePath); 
    } 

    return Enumerable.SelectMany(searchPatterns, 
         p => Directory.GetFiles(basePath, p)); 
} 

Utilisation:

GetFiles(@"c:\", "*.c", "*.h"); 

vous voulez probablement ajouter une validation