1 / 1 / 0
Регистрация: 27.03.2015
Сообщений: 36
1

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

02.04.2015, 10:56. Показов 1684. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, есть кнопка с выбором папки и выводом файлов *.doc в listbox.
Можно ли сделать рекурсивный поиск? Например выбираю Папку, и в ней есть несколько под папок с файлами *.doc,
и он считывает все файлы в lsitbox

Код кнопки
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub CommandButton1_Click()
        curr_dir$ = Module1.SelDir(0)
        If curr_dir$ <> "" Then
           Me.Label2 = curr_dir$
           Me.ListBox1.Clear
           cF$ = Dir$(curr_dir$ + "\*.doc")
           Do
              If cF$ = "" Then Exit Do
              Me.ListBox1.AddItem cF$
              cF$ = Dir$()
           Loop
        End If
TPath = curr_dir
End Sub
Модуль
Visual Basic
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
Option Explicit
Option Base 1
 
    
 
Public TPath As String
 
Const BIF_RETURNONLYFSDIRS = 1
Const BIF_DONTGOBELOWDOMAIN = 2
Const MAX_PATH = 260
 
Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long
 
Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
 
                                        
Private Type BrowseInfo
    hWndOwner      As Long
    pIDLRoot       As Long
    pszDisplayName As Long
    lpszTitle      As Long
    ulFlags        As Long
    lpfnCallback   As Long
    lParam         As Long
    iImage         As Long
End Type
 
 
Function SelDir(hwnd As Long) As String
  
  Dim lpIDList    As Long
  Dim sBuffer     As String
  Dim szTitle     As String
  Dim tBrowseInfo As BrowseInfo
    
  szTitle = "Выбор папки :"
  
  With tBrowseInfo
    .hWndOwner = hwnd
    .lpszTitle = lstrcat(szTitle, "")
    .ulFlags = BIF_RETURNONLYFSDIRS + BIF_DONTGOBELOWDOMAIN
  End With
  
 
  lpIDList = SHBrowseForFolder(tBrowseInfo)
 
 
  If (lpIDList) Then
     sBuffer = Space(MAX_PATH)
     SHGetPathFromIDList lpIDList, sBuffer
     sBuffer = Left(sBuffer, InStr(sBuffer, vbNullChar) - 1)
     SelDir = sBuffer
  Else
     SelDir = ""
  End If
  
End Function
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.04.2015, 10:56
Ответы с готовыми решениями:

Рекурсивный подсчет времени ожидания
Всем привет, задача такая: есть набор действий в проекте, которые необходимо выполнить, чтобы...

Рекурсивный поиск
Добрый день, необходимо пройтись рекурсивным поиском по всему компьютеру и найти директорию...

Рекурсивный поиск
Собственно нашёл код Procedure ScanDir(StartDir: String; Mask:string; List:TStrings); {...

Рекурсивный Поиск файлов
Доброго всем времени суток, я к вам со следующей проблемой: необходимо разобраться с рекурсивным...

7
Модератор
Эксперт MS Access
11955 / 4823 / 779
Регистрация: 07.08.2010
Сообщений: 14,127
Записей в блоге: 4
02.04.2015, 11:09 2
нельзя одновременно иметь два DIR

сначала считывать только папки и пополнять массив
ПОТОМ УЖЕ ИСКАТЬ ТРЕБУЕМОЕ
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
02.04.2015, 12:11 3
Как-то много кода... зачем так накручено в SelDir()?

Я обычно делал через FSO, вот например пример на переделку (не моё) - выбор папки можно добавить с SelDir():
Visual Basic
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
39
Option Explicit
 
Sub GetData()
 
    Dim fso As New FileSystemObject
    Dim aFile As File, aFolder As Folder
    Dim wkb As Workbook, wks As Worksheet
    Dim arr(1 To 4) As Variant
    Dim iRow As Integer
    
    iRow = 2
    
    For Each aFolder In fso.GetFolder(ThisWorkbook.Path).SubFolders
    
        For Each aFile In aFolder.Files
            If fso.GetExtensionName(aFile.Name) Like "xls*" Then
            
                Set wkb = Workbooks.Open(aFile.Path)
                Set wks = wkb.Worksheets(1)
                With wks
                    arr(1) = .Range("B9").MergeArea.Cells(1, 1)
                    arr(2) = .Range("A12").MergeArea.Cells(1, 1)
                    arr(3) = .Range("I10").MergeArea.Cells(1, 1)
                    arr(4) = .Range("L10").MergeArea.Cells(1, 1)
                End With
                
                Sheet1.Cells(iRow, 1).Resize(1, 4) = arr
                iRow = iRow + 1
                
                wkb.Close SaveChanges:=False
                Set wks = Nothing
                Set wkb = Nothing
 
            End If
        Next
    
    Next
 
End Sub
Добавлено через 2 минуты
Показали бы свой файл с формой - можно было бы туда код и встроить. А так лениво это всё изготавливать...
0
15145 / 6418 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
02.04.2015, 12:52 4
Можно без рекурсии, вот подобное: Поиск файла в папке по тексту из ячейки книги
Чтобы обработать подпапки, надо добавить ключ /s к dir
dir /b/s "путь\*.doc"
0
1 / 1 / 0
Регистрация: 27.03.2015
Сообщений: 36
02.04.2015, 13:27  [ТС] 5
Казанский, В коде так и будет "dir /s" ???
0
15145 / 6418 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
02.04.2015, 13:38 6
Да. То есть в том коде 11 строка будет
Visual Basic
1
    .WriteText CreateObject("wscript.shell").Exec("cmd /c dir /s/b/o:d """ & fldr & "*.doc""").StdOut.ReadAll
Это поиск всех файлов .doc в папке fldr и подпапках.
Можете убрать /o:d, если сортировка не нужна.
0
1 / 1 / 0
Регистрация: 27.03.2015
Сообщений: 36
02.04.2015, 13:52  [ТС] 7
Hugo121, вот файл 32.rar
0
1 / 1 / 0
Регистрация: 27.03.2015
Сообщений: 36
03.04.2015, 10:47  [ТС] 8
Казанский, 11 строка в коде модуля?

Добавлено через 1 час 46 минут
Казанский, Тот код выводит всё в ячейку, и рекурсии подобной там нету, так же файлы выводятся из папки, подпапки не читает
0
03.04.2015, 10:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.04.2015, 10:47
Помогаю со студенческими работами здесь

Рекурсивный поиск. Снова
Добрый день. Тема эта избита, знаю, но тем не менее, ответа на свой вопрос я здесь не нашел (или не...

Рекурсивный поиск в списке
Добрый вечер. Я решал одну задачку из книги Х.Дейтела и П.Дейтела &quot;Как программировать на C++&quot; и у...

Рекурсивный поиск не работает
Делал что-то вроде бд, всё неплохо, но поиск всегда возвращает 0. public int Find(string str) ...

рекурсивный поиск файлов
Всем привет! Нажно реализовать поиск файлов по маске. Набрасал вот такой код: int...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru