web-dev-qa-db-fra.com

Directory.GetFiles d'une certaine extension

Existe-t-il un moyen de simplifier cette expression linq ou existe-t-il un meilleur moyen de le faire?

Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories)
         .Where(s => s.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase) ||
                     s.EndsWith(".gif", StringComparison.OrdinalIgnoreCase) ||
                     s.EndsWith(".png", StringComparison.OrdinalIgnoreCase) ||
                     ...);

En gros, je veux renvoyer tous les fichiers d’une certaine extension. Malheureusement, cette méthode n'est pas très flexible. Je préférerais pouvoir ajouter des extensions à une liste et faire en sorte que Directory.GetFiles renvoie ces extensions. Est-ce possible?

47
XSL

Si vous souhaitez effectuer votre filtrage dans LINQ, vous pouvez le faire comme suit:

var ext = new List<string> {".jpg", ".gif", ".png"};
var myFiles = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories)
     .Where(s => ext.Contains(Path.GetExtension(s)));

Maintenant, ext contient une liste des extensions autorisées; vous pouvez en ajouter ou en supprimer si nécessaire pour un filtrage flexible.

94
dasblinkenlight

La surcharge Directory.GetFiles(String, String) ne le fait-elle déjà? Vous ne feriez que Directory.GetFiles(dir, "*.jpg", SearchOption.AllDirectories)

Si vous voulez les mettre dans une liste, remplacez simplement le "*.jpg" avec une variable qui parcourt une liste et agrège les résultats dans un ensemble de résultats global. Beaucoup plus clair que de les spécifier individuellement. =)

Quelque chose comme...

foreach(String fileExtension in extensionList){
    foreach(String file in Directory.GetFiles(dir, fileExtension, SearchOption.AllDirectories)){
        allFiles.Add(file);
    }
}

(Si vos répertoires sont volumineux, l'utilisation de EnumerateFiles au lieu de GetFiles peut potentiellement être plus efficace)

14
Tyler Lee

J'aurais fait en utilisant une seule ligne comme

List<string> imageFiles = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories)
      .Where(file => new string[] { ".jpg", ".gif", ".png" }
      .Contains(Path.GetExtension(file)))
      .ToList();
5
RkHirpara