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");
Réponses
Trop de publicités?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");
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).
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();
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.