104 votes

GetFiles avec plusieurs extentions

Double Possible:
Pouvez-vous appeler Répertoire.GetFiles() avec plusieurs filtres?

Comment faire un filtre sur plus d'une extension?

J'ai essayé:

FileInfo[] Files = dinfo.GetFiles("*.jpg;*.tiff;*.bmp");
FileInfo[] Files = dinfo.GetFiles("*.jpg,*.tiff,*.bmp");

78voto

Danny Chen Points 14781

Pourquoi ne pas créer une méthode d'extension? C'est plus lisible.

public static IEnumerable<FileInfo> GetFilesByExtensions(this DirectoryInfo dir, params string[] extensions)
{
    if (extensions == null) 
         throw new ArgumentNullException("extensions");
    IEnumerable<FileInfo> files = Enumerable.Empty<FileInfo>();
    foreach(string ext in extensions)
    {
       files = files.Concat(dir.GetFiles(ext));
    }
    return files;
}

EDIT: une version efficace:

public static IEnumerable<FileInfo> GetFilesByExtensions(this DirectoryInfo dir, params string[] extensions)
{
    if (extensions == null) 
         throw new ArgumentNullException("extensions");
    IEnumerable<FileInfo> files = dir.EnumerateFiles();
    return files.Where(f => extensions.Contains(f.Extension));
}

Utilisation:

dInfo.GetFilesByExtensions(".jpg",".exe",".gif");

73voto

SLaks Points 391154

Vous pouvez obtenir tous les fichiers, puis filtrer le tableau:

public static IEnumerable<FileInfo> GetFilesByExtensions(this DirectoryInfo dirInfo, params string[] extensions)
{
    var allowedExtensions = new HashSet<string>(extensions, StringComparer.OrdinalIgnoreCase);

    return dirInfo.EnumerateFiles()
                  .Where(f => allowedExtensions.Contains(f.Extension));
}

Ce sera (un peu) plus rapide que tous les autres de réponse ici.
Dans .Net 3.5, remplacez - EnumerateFiles avec GetFiles (ce qui est plus lent).

60voto

Thomas Levesque Points 141081

Vous ne pouvez pas le faire, parce qu' GetFiles n'accepte qu'un seul modèle de recherche. Au lieu de cela, vous pouvez appeler GetFiles sans motif, et de filtrer les résultats dans le code:

string[] extensions = new[] { ".jpg", ".tiff", ".bmp" };

FileInfo[] files =
    dinfo.GetFiles()
         .Where(f => extensions.Contains(f.Extension.ToLower()))
         .ToArray();

Si vous travaillez avec .NET 4, vous pouvez utiliser l' EnumerateFiles méthode pour éviter le chargement de tous les FileInfo les objets en mémoire à la fois:

string[] extensions = new[] { ".jpg", ".tiff", ".bmp" };

FileInfo[] files =
    dinfo.EnumerateFiles()
         .Where(f => extensions.Contains(f.Extension.ToLower()))
         .ToArray();

27voto

Evgeny Points 1291

Vous pouvez utiliser LINQ méthode de l'Union:

dir.GetFiles("*.txt").Union(dir.GetFiles("*.jpg")).ToArray();

8voto

Timwi Points 30896

Le suivant récupère le jpg, tiff et bmp fichiers et vous donne un IEnumerable<FileInfo> - dessus de laquelle vous pouvez effectuer une itération:

var files = dinfo.GetFiles("*.jpg")
    .Concat(dinfo.GetFiles("*.tiff"))
    .Concat(dinfo.GetFiles("*.bmp"));

Si vous avez vraiment besoin d'un tableau, il suffit de bâton .ToArray() à la fin de cette.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X