более быстрые файлы getfiles в каталоге

У меня есть код, который должен искать около 30000 файлов в нескольких подкаталогах, чтобы увидеть, существуют ли какие-либо файлы с определенным расширением. Он работает по сети с общим ресурсом iSeries. Любое предложение сделать это быстрее.

Dim _cnt As Int16 = _di.GetFiles("*." + row("extension"), SearchOption.AllDirectories).Length
                    If _cnt > 0 Then
                        Dim _msg As String = _dir + " still has " + _cnt.ToString() + " " + row("extension")
                        MessageBox.Show(_msg, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
                        ts_StatusLabel.Text = _msg
                        Return
                    End If

Также есть ли способ остановить поиск при первом попадании?

Спасибо.


person jwhitf4770    schedule 22.08.2014    source источник
comment
Итак, вам не нужен список, только один файл или ничего? Directory.EnumerateFiles может сломаться при первом совпадении   -  person Alex K.    schedule 22.08.2014


Ответы (1)


Чтобы просто узнать, присутствует ли файл с определенным расширением в структуре папок, вы можете использовать DirectoryInfo.EnumerateFiles с Any(). Это запускает перечисление немедленно, не дожидаясь загрузки всех файлов с указанным расширением.

Dim extFound = _di.EnumerateFiles("*." & row("extension"), _
                                  SearchOption.AllDirectories).Any()
If extFound Then
   Console.WriteLine("File with specific extension found")
End If

Конечно, это не возвращает количество файлов с этим расширением, а просто сообщает, существует ли файл с указанным расширением.

Если вам нужен счет, вы можете использовать расширение Count(). Но тогда вам нужно подождать, пока весь поиск не будет завершен, и поэтому он не сильно отличается от вашего текущего кода.

Dim _cnt = _di.EnumerateFiles("*." + row("extension"), _
                              SearchOption.AllDirectories).Count()
If _cnt Then
   Console.WriteLine("Found " & _cnt & " file/s")
End If

Как бы то ни было, простой тест в моей папке Microsoft Visual Studio (37000 файлов) для поиска файлов с расширением EXE требует 960 миллисекунд для Count() и не поддается измерению (0 миллисекунд) для Any() (на SSD-диске)

person Steve    schedule 22.08.2014
comment
Это отличное время. Я вижу до 10 минут. Это должны быть проблемы с сетью. - person jwhitf4770; 22.08.2014
comment
Что ж, как я уже сказал, чего бы это ни стоило, условия заметно отличаются - person Steve; 22.08.2014