2014-08-22 3 views
1

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

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 

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

спасибо.

+0

Значит, вам не нужен список только одного файла или нет? Directory.EnumerateFiles может сломаться в первом матче –

ответ

4

Чтобы узнать, существует ли файл с определенным расширением в структуре папок, вы можете использовать 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 милли) для любого() (На диске SSD)

+0

Это отличные тайминги. Я вижу до 10 минут. Это должны быть проблемы с сетью. – jwhitf4770

+0

Ну, как я уже сказал, для чего это стоит, условия необычайно разные – Steve