Подсчет файлов изображений в каталоге

Я пытаюсь перечислить и импортировать несколько файлов изображений в папку. Мой текущий код для подсчета изображений выглядит следующим образом:

Dim fullpath As String
fullpath = TxtPath.Text + "\"


Dim FileDirectory As New IO.DirectoryInfo(fullpath)
Dim FileJpg As IO.FileInfo() = FileDirectory.GetFiles("*.jpg")
Dim FileJpeg As IO.FileInfo() = FileDirectory.GetFiles("*.jpeg")
Dim FileGif As IO.FileInfo() = FileDirectory.GetFiles("*.gif")
Dim FileBmp As IO.FileInfo() = FileDirectory.GetFiles("*.bmp")
Dim FilePng As IO.FileInfo() = FileDirectory.GetFiles("*.png")

Dim count As Integer = 0

For Each File As IO.FileInfo In FileJpg
    count += 1
Next
For Each File As IO.FileInfo In FileJpeg
    count += 1
Next
For Each File As IO.FileInfo In FileGif
    count += 1
Next
For Each File As IO.FileInfo In FileBmp
    count += 1
Next
For Each File As IO.FileInfo In FilePng
    count += 1
Next

Есть ли более эффективный способ сделать это в одном цикле For, а не в 5 отдельных — можете ли вы отправить массив расширений файлов в GetFiles?

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

Спасибо!


person Optimaximal    schedule 17.04.2014    source источник


Ответы (2)


Не лучшее решение, но сейчас у меня нет времени на LINQ. Попробуй это:

Dim extensions As New List(Of String)
extensions.Add("*.png")
' And so on, until all are in...

Dim fileCount As Integer
For i As Integer = 0 To extensions.Count - 1
  fileCount += Directory.GetFiles(txtPath.Text, extensions(i), SearchOption.AllDirectories).Length
Next
person Dominic B.    schedule 17.04.2014

Прошло некоторое время с тех пор, как я смотрел на VB.NET, но в C# вы могли бы сделать что-то вроде этого:

    static void Main(string[] args)
    {
        string filePath = @"I:\Archive\2009.12.21c";

        List<string> extensions = new List<string>{
            ".jpg",
            ".jpeg",
            ".png",
        };

        string[] countImages = System.IO.Directory.GetFiles(filePath);

        foreach (string file in countImages)
        {
            if (extensions.Contains(System.IO.Path.GetExtension(file).ToLowerInvariant()))
            {
                //This is where you can add to your count for found files
            }
        }
    }

Все это классы .NET, и их должно быть достаточно просто перевести обратно в VB.NET.


Изменить для @Trade

@Trade Хорошо, я смог добраться до него. Запустил ваш код (преобразованный в C#) и мой код, 6 циклов у меня, затем у вас, затем еще 6 у вас, а затем у меня. 6 раз, за ​​которыми следует ваш, а затем 6 прогонов через мой, а затем переворачивают их (все, чтобы убедиться, что не JIT-разогрев) и результаты: разница более чем на порядок в предпочтении подхода, который я использовал:

Пример: у вас enum2, у меня enum1

Found 37 with dir enum1 in 609
Found 37 with dir enum1 in 469
Found 37 with dir enum1 in 462
Found 37 with dir enum1 in 455
Found 37 with dir enum1 in 448
Found 37 with dir enum1 in 406
Found 37 with dir enum2 in 6314
Found 37 with dir enum2 in 6888
Found 37 with dir enum2 in 5439
Found 37 with dir enum2 in 5614
Found 37 with dir enum2 in 5824
Found 37 with dir enum2 in 6342

Вот преобразованный код для вашего метода:

private static void enum2(string filePath, List<string> extensions)
{
    System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
    sw.Start();
    int countCount = 0;
    for (int i = 0; i < extensions.Count(); i++)
    {
        string curExt = extensions[i];
        countCount += System.IO.Directory.GetFiles(filePath, "*" +
            curExt, System.IO.SearchOption.TopDirectoryOnly).Length;
    }
    sw.Stop();

    Console.WriteLine("Found {0} with dir enum2 in {1}",
        countCount, sw.ElapsedTicks.ToString());
}
person Austin T French    schedule 17.04.2014
comment
Почему бы просто не взять свойство Length из Directory.GetFiles, используя его перегрузку для установки расширения? Также countImages как строка [] может немного сбивать с толку. - person Dominic B.; 17.04.2014
comment
@Trade на имя countImages, вы правы, это может быть. Что касается метода подсчета (все еще рано, так что мозг немного нечеткий), кажется, что он будет медленнее, так как диск придется пересчитывать больше раз. Позже я попытаюсь остановить просмотр обоих маршрутов. - person Austin T French; 17.04.2014
comment
@Trade, это вообще помогает или удовлетворяет любопытство? - person Austin T French; 18.04.2014
comment
Интересно посмотреть, так что да. - person Dominic B.; 18.04.2014