Аватар для Л. А.
20 / 9 / 0
Регистрация: 25.06.2011
Сообщений: 74
.NET 4.x

Рекурсивный поиск файлов

03.03.2013, 15:59. Показов 2485. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем здравия.
Недельку назад начал копать информацию про рекурсивный поиск, то ли я плохо ищу, то ли чего то не до понимаю, все что я нашел, или не работает, или просто делает вид что работает но результатов ноль. Кто может, поделитесь рабочим примером сего действия. Буду очень признателен.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.03.2013, 15:59
Ответы с готовыми решениями:

Провести рекурсивный поиск файлов по маске
всем привет необходимо провести рекурсивный поиск файлов по маске, использую Winapi, а именно Findfirstfile, findnextfile, findclose. ...

Поиск файлов по маске
Возможно ли сделать так ,чтобы программа сканировала диски и нашла файлы в формате .jpg ?

Поиск файлов по маске
Как реализовать поиск файлов по маске "*.txt"? Файлы могут быть в любой папке диска C: или даже D:

3
 Аватар для Апострофф
9903 / 3912 / 740
Регистрация: 11.10.2011
Сообщений: 5,891
03.03.2013, 16:05
Л. А., давай наиболее близкий к требуемому результат поисков, доделаем быть может?
0
 Аватар для Л. А.
20 / 9 / 0
Регистрация: 25.06.2011
Сообщений: 74
04.03.2013, 08:24  [ТС]
Цитата Сообщение от Апострофф Посмотреть сообщение
Л. А., давай наиболее близкий к требуемому результат поисков, доделаем быть может?
Что то нарыл:

Код формы:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Imports System.Threading
Public Class Form1
    Public trd As Thread
 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = False
    End Sub
 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        trd = New Thread(AddressOf ThreadTask)
        trd.IsBackground = True
        trd.Start()
 
       
    End Sub
    Private Sub ThreadTask()
        Dim rnd As New Random()
        Dim searcher As New FindFiles
        For Each s As String In searcher.FindAllFiles("c:\", "*.txt")
                     ListBox1.Items.Add(s)
            Label1.Text = s
            Label2.Text = Label2.Text + 1
            Thread.Sleep(100)
        Next
        ListBox1.Items.Add("Done!")
          End Sub
End Class
Код класса:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Class FindFiles
    Public Function FindAllFiles(ByVal startPath As String, ByVal pattern As String) As List(Of String)
        Dim dir As System.IO.DirectoryInfo = My.Computer.FileSystem.GetDirectoryInfo(startPath)
        Return FindFile(dir, SimplePat2RegEx(pattern))
    End Function
 
    Private Function SimplePat2RegEx(ByVal pattern As String) As String
        Return pattern.Replace("*", "[a-zA-Z0-9]+").Replace("?", "[a-zA-Z0-9]{1,1}")
    End Function
 
    Private Function FindFile(ByVal dir As IO.DirectoryInfo, ByVal pattern As String) As List(Of String)
        Dim out As New List(Of String)
        Try
            For Each f As IO.FileInfo In dir.GetFiles
                If IsMatch(f.FullName, pattern) Then
                    out.Add(f.FullName)
                    Debug.Print(f.FullName)
                End If
            Next
 
            For Each d As IO.DirectoryInfo In dir.GetDirectories
                For Each o As String In FindFile(d, pattern)
                    out.Add(o)
                Next
            Next
        Catch ex As Exception
 
        End Try
 
        Return out
    End Function
 
    Private Function IsMatch(ByVal filename As String, ByVal pattern As String)
        Dim regex As New System.Text.RegularExpressions.Regex(pattern)
        Return regex.IsMatch(filename)
    End Function
End Class
Код рабочий, поток добавил сам а то программа висла.
И так, что мы имеем. При запуске поиска, он начинается не с разу а с задержкой в 15 - 20 сек, это слишком. Далее вроде как начинает искать и результат виден. Если в строке поиска прописать не "*.txt" а "*.*". Начинается висяк а мне еще и все диски пронюхивать надо, с этим разберусь но как заставить работать этот код быстро, не пойму....

Добавлено через 16 часов 5 минут
Покопавшись в недрах интернета, набрел еще на один форум и предложил им сей код с таким же вопросом. Этот код был полностью раскритикован в том что он полностью "кривой" и написан "кривыми" руками и предложили более "нормальный " вариант.

Вот код:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Imports System.IO
Imports System.Threading
 
Public Class Form1
 
Private Sub BtnSearch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSearch.Click
  Dim Mask As String = TxtMask.Text
 
  Call (New Thread(Sub()
    BtnSearch.Invoke(Sub() BtnSearch.Enabled = False)
 
    For Each Root As String In Directory.GetLogicalDrives()
      Search(Root, Mask, Sub(Results As String()) LstResult.Invoke(Sub() LstResult.Items.AddRange(Results)))
    Next Root
 
    BtnSearch.Invoke(Sub() BtnSearch.Enabled = True)
  End Sub)).Start()
End Sub
 
Sub Search(ByVal Folder As String, ByVal Mask As String, ByVal Callback As Action(Of String()))
  Try
    Callback(Directory.GetFiles(Folder, Mask))
  Catch ex As Exception
  End Try
 
  Try
    For Each Folder In Directory.GetDirectories(Folder)
      Search(Folder, Mask, Callback)
    Next Folder
  Catch ex As Exception
  End Try
End Sub
 
Private Sub Form1_FormClosed(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed
  End
End Sub
 
End Class
Код работает достаточно шустро, но я не могу визуализировать его, т.е. Во время сканирования список будет скрыт а видны будут два лейбла: 1-й - в нем будет отображаться последний найденный файл а во 2-м общее количество найденных файлов. Вопрос: В какую часть кода нужно запихать два лейбла что бы все работало?
0
25 / 25 / 3
Регистрация: 10.06.2009
Сообщений: 134
04.03.2013, 21:22
LstResult я так понял это объект класса ListView?
Так вот в строке
VB.NET
1
Search(Root, Mask, Sub(Results As String()) LstResult.Invoke(Sub() LstResult.Items.AddRange(Results)))
методом Invoke этот контрол "оккупируется" дочерним потоком полностью и потому не происходит его обновление в процессе поиска.
Частично решить этот вопрос можно так
VB.NET
1
2
3
4
5
Dim frm as New Form1'или передать Me параметром в поток
For Each Root As String In Directory.GetLogicalDrives()
      Search(Root, Mask, Sub(Results As String()) LstResult.Invoke(Sub() LstResult.Items.AddRange(Results)))
      frm.Refresh()
Next Root
либо использовать Invoke при записи каждой строки в LstResult.
"Частично", потому что возникнет проблема "блинка" - если файлов будет найдено дофига, то перерисовываться LstResult будет очень часто, что замедлит поиск. Как решить этот вопрос - сам не знаю. Создал здесь тему по этому поводу - пока молчат...
Может че не так пишу - извиняюсь. Сам столкнулся с подобным.

ЗЫ Зачем отдельная рекурсия тогда, если в этом коде есть
VB.NET
1
Directory.GetFiles(Folder, Mask)
Этот же метод:
VB.NET
1
Directory.GetFiles(Folder,Microsoft.VisualBasic.FileIO.SearchOption.SearchAllSubDirectories, Mask)
Ищет в всех подпапках. Разве что на другие диски не лезет...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.03.2013, 21:22
Помогаю со студенческими работами здесь

Поиск файлов и загрузка их на FTP
что в этом коде не так? не копирует файлы не отправляет, а создаёт пустую папку .jpg на FTP Imports System.IO Imports System.Net ...

Не работает поиск файлов на диске
Dim a() As String = IO.Directory.GetFiles("с:", ".exe", IO.SearchOption.TopDirectoryOnly) Почему a() все время 0, функция ничего не...

Поиск файлов и сбой работы
Всем привет! Есть код поиска файлов: Private Sub ThreadTask() Try ListView1.Items.Add("Задача...

Поиск файлов и ошибка файловой системы
Всем здравия и приятного денечка. Имеется код: Imports System.Windows.Forms Imports System.Drawing Imports...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

Новые блоги и статьи
Как использовать Bluetooth-модуль HC-05 с Arduino
Wired 08.07.2025
Bluetooth - это технология, созданная чтобы заменить кабельные соединения. Обычно ее используют для связи небольших устройств: мобильных телефонов, ноутбуков, наушников и т. д. Работает она на частоте. . .
Руководство по структурам данных Python
AI_Generated 08.07.2025
Я отчетливо помню свои первые серьезные проекты на Python - я писал код, он работал, заказчики были относительно довольны. Но однажды мой наставник, взглянув на мою реализацию поиска по огромному. . .
Тестирование энергоэффективности и скорости вычислений видеокарт в BOINC проектах
Programma_Boinc 08.07.2025
Тестирование энергоэффективности и скорости вычислений видеокарт в BOINC проектах Опубликовано: 07. 07. 2025 Рубрика: Uncategorized Автор: AlexA Статья размещается на сайте с разрешения. . .
Раскрываем внутренние механики Android с помощью контекста и манифеста
mobDevWorks 07.07.2025
Каждый Android-разработчик сталкивается с Context и манифестом буквально в первый день работы. Но много ли мы задумываемся о том, что скрывается за этими обыденными элементами? Я, честно говоря,. . .
API на базе FastAPI с Python за пару минут
AI_Generated 07.07.2025
FastAPI - это относительно молодой фреймворк для создания веб-API, который за короткое время заработал бешеную популярность в Python-сообществе. И не зря. Я помню, как впервые запустил приложение на. . .
Основы WebGL. Раскрашивание вершин с помощью VBO
8Observer8 05.07.2025
На русском https:/ / vkvideo. ru/ video-231374465_456239020 На английском https:/ / www. youtube. com/ watch?v=oskqtCrWns0 Исходники примера:
Мониторинг микросервисов с OpenTelemetry в Kubernetes
Mr. Docker 04.07.2025
Проблема наблюдаемости (observability) в Kubernetes - это не просто вопрос сбора логов или метрик. Это целый комплекс вызовов, которые возникают из-за самой природы контейнеризации и оркестрации. К. . .
Проблемы с Kotlin и Wasm при создании игры
GameUnited 03.07.2025
В современном мире разработки игр выбор технологии - это зачастую балансирование между удобством разработки, переносимостью и производительностью. Когда я решил создать свою первую веб-игру, мой. . .
Создаем микросервисы с Go и Kubernetes
golander 02.07.2025
Когда я только начинал с микросервисами, все спорили о том, какой язык юзать. Сейчас Go (или Golang) фактически захватил эту нишу. И вот почему этот язык настолько заходит для этих задач: . . .
C++23, квантовые вычисления и взаимодействие с Q#
bytestream 02.07.2025
Я всегда с некоторым скептицизмом относился к громким заявлениям о революциях в IT, но квантовые вычисления - это тот случай, когда революция действительно происходит прямо у нас на глазах. Последние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru