Directory.GetAllImageFiles Как мне это сделать? - PullRequest
1 голос
/ 12 февраля 2011

Я бы хотел заполнить массив строк всеми изображениями, найденными в каталоге.

До сих пор я использую следующее, чтобы получить все изображения в формате jpg

Dim List() as string = Directory.GetFiles(Path, "*.jpg")

Теперь я хотел бы расширить его и получить все форматы изображений.

Могу ли я использовать каталог. GetFiles в сочетании с "ImageFormat перечислением"?

Ответы [ 2 ]

1 голос
/ 12 февраля 2011

Привет, вы можете использовать это, которое я нашел в качестве контента сообщества на 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 и как ищет ОС.Нужен тест производительности, которого я еще не делал.

0 голосов
/ 12 февраля 2011

Это решение 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;
}
...