Directory.getAllimageFiles Comment dois-je le faire?
-
12-11-2019 - |
Question
Je voudrais obtenir un tableau de chaîne avec toutes les images trouvées dans un répertoire.
Jusqu'à présent, j'utilise ce qui suit pour obtenir toutes les images avec le format JPG
Dim List() as string = Directory.GetFiles(Path, "*.jpg")
Maintenant, je voudrais l'étendre et obtenir tous les formats d'image.
Puis-je utiliser le répertoire.getFiles combiné avec un "ImageFormat
énumération"?
La solution
Salut vous pouvez utiliser ce que j'ai trouvé comme contenu communautaire à http://msdn.microsoft.com/en-us/library/wz42302f.aspx.:
private static string[] GetFiles(string sourceFolder, string filters)
{
return filters.Split('|').SelectMany(filter => System.IO.Directory.GetFiles(sourceFolder, filter)).ToArray();
}
Une alternative qui utilise une évaluation paresseuse (.NET 4.0 uniquement):
private static IEnumerable<string> GetFiles(string sourceFolder, string filters)
{
return filters.Split('|').SelectMany(filter => System.IO.Directory.EnumerateFiles(sourceFolder, filter));
}
Vous pouvez l'utiliser comme GetFiles("dir", "*.jpg|*.gif|*.jpeg|*.bmp|*.png")
. C'est essentiellement une recherche pour chaque filtre, donc c'est ne pas Aussi efficace que possible.
Une version finale est (est .NET 4.0 uniquement, mais peut être faite sur une solution 2.0 au moins):
private static IEnumerable<string> GetImageFiles(string sourceFolder)
{
return from file in System.IO.Directory.EnumerateFiles(sourceFolder)
let extension = Path.GetExtension(file)
where extension == ".jpg" || extension == ".gif" || extension == ".png"
select file;
}
Je crois que le dernier est le plus rapide car il ne boucle qu'une seule fois. Mais cela dépend de la façon dont la recherche de motifs est implémentée dans Directory
et comment le système d'exploitation recherche. Un test de performance est nécessaire que je n'ai pas fait.
Autres conseils
Il s'agit de la solution 2.0 .NET.
J'ai fait quelque chose de similaire en C #. Cette solution a utilisé un dossier comme point de dépôt pour le traitement des images. Le chargement de chaque type de fichier en tant qu'image n'est pas une solution correcte dans tous les cas, mais je voulais valider chaque fichier en tant qu'image chargée.
string[] files = Directory.GetFiles(folderPath);
foreach(string file in files)
{
System.Drawing.Image img = null;
try
{
img = System.Drawing.Image.FromFile(file);
}
catch
{
// do nothing
}
if (img != null)
{
// did something
img.Dispose();
}
}
Il s'avère que j'ai oublié une pièce ... Avant de traiter les fichiers, j'ai utilisé une fonction pour limiter les fichiers en cours de traitement:
private bool IsImage(FileInfo file)
{
bool imageFile = false;
if ((file.Extension.ToLower() ==".jpg")||
(file.Extension.ToLower() ==".gif")||
(file.Extension.ToLower() == ".bmp") ||
(file.Extension.ToLower() ==".png"))
{
imageFile = true;
}
return imageFile;
}