Directory.GetAllImageFiles Как мне это сделать?
Я хотел бы получить заполнить массив строк со всеми изображениями, найденными в каталоге.
До сих пор я использую следующее, чтобы получить все изображения в формате JPG
Dim List() as string = Directory.GetFiles(Path, "*.jpg")
Теперь я хотел бы расширить его и получить все форматы изображений.
Могу ли я использовать каталог.GetFiles в сочетании с "ImageFormat
перечисление "?
2 ответа
Здравствуйте, вы можете использовать это, которое я нашел в качестве контента сообщества по адресу 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();
}
альтернатива, которая использует ленивую оценку (только.Net 4.0):
private static IEnumerable<string> GetFiles(string sourceFolder, string filters)
{
return filters.Split('|').SelectMany(filter => System.IO.Directory.EnumerateFiles(sourceFolder, filter));
}
Вы можете использовать его как GetFiles("dir", "*.jpg|*.gif|*.jpeg|*.bmp|*.png")
, По сути, это просто поиск для каждого фильтра, поэтому он не настолько эффективен, насколько это возможно.
Окончательная версия (только для.Net 4.0, но может быть сделана как минимум для решения 2.0):
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;
}
Я считаю, что последний самый быстрый, потому что он зацикливается только один раз. Но это зависит от того, как поиск по шаблону реализован в Directory
и как ОС ищет. Нужен тест производительности, которого я еще не делал.
Это решение 2.0 .net.
Я сделал нечто подобное в C#. Это решение использовало папку в качестве отправной точки для обработки изображений. Загрузка файлов каждого типа в качестве изображения не является правильным решением во всех случаях, но я хотел проверить каждый файл как загружаемое изображение.
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();
}
}
Оказывается, я забыл кусок... Прежде чем обрабатывать файлы, я использовал функцию для ограничения файлов, обрабатываемых:
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;
}