В этой статье описывается минимальный код для поиска файлов и папок с использованием API функций FindFirstFile, FindNextFile и FindClose. Данный пример поиска довольно прост, он позволяет задать только одиночный запрос: "*.*" или "*", запрос с несколькими файлами не даст результатов: "*.bmp,*.gif".
В этой статье описывается минимальный код для поиска файлов и папок с использованием API функций FindFirstFile, FindNextFile и FindClose. Данный пример поиска довольно прост, он позволяет задать только одиночный запрос: "*.*" или "*", запрос с несколькими файлами не даст результатов: "*.bmp,*.gif". Его принцип таков:
Ищем все подкаталоги в папке, в которой был указан поиск.
В каждом найденном подкаталоге ищем файлы, указанные для поиска.
Для реализации принципа, во - первых, нам потребуется создать функцию поиска папок:
Private Sub SearchForFolders(fName As String, Path As String, File As String) 'fName - указывает, какие подкаталоги будем искать("*" - все подкаталоги, как и в нашем случае); Path - указывает, в какой папке будем искать; File - указывает, какой файл будем искать. If StopSearch = True Then Exit Sub 'переменная StopSearch указывает, должен ли быть прерван поиск. Dim Atr As Integer Dim hFnd As Long Dim WFD As WIN32_FIND_DATA hFnd = FindFirstFile(Path & fName, WFD) 'ищем первый подкаталог. If hFnd = INVALID_HANDLE_VALUE Then Exit Sub 'если подкаталог не найден, то выходим из функции. SearchForFiles File, Path 'вызывает ещё одну фнкцию для поиска файлов в папке. Do Atr = (WFD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) 'узнаём, является ли найденный файл папкой If TrimNull(WFD.cFileName) <> "." And TrimNull(WFD.cFileName) <> ".." Then 'если папка не является корневой на диске, то функция FindNextFile возвращает эти два значения. If Atr > 0 Then DoEvents SearchForFolders fName, Path & TrimNull(WFD.cFileName) & "", File 'Если файл является папкой, то снова вызываем функцию поиска подкаталогов в этой папке. End If End If Loop While FindNextFile(hFnd, WFD) 'производим поиск до конца. FindClose hFnd 'освобождаем память. End Sub
Думаю, что всем понятен принцип этой функции: производится поиск всех папок, для каждой папки производится поиск подкаталогов и так далее, пока не будут найдены все папки - в этом и заключается рекурсия. Одновременно с поиском папок в них производится поиск указанного файла. Функция для поиска файлов почти аналогична функции поиска папок:
Private Sub SearchForFiles(fName As String, Path As String) 'Path - указывает в какой папке будет производится поиск фалов, указанных в параметре fName. If StopSearch = True Then Exit Sub Dim Atr As Integer Dim hFnd As Long Dim WFD As WIN32_FIND_DATA hFnd = FindFirstFile(Path & fName, WFD) 'ищем первый файл. If hFnd = INVALID_HANDLE_VALUE Then Exit Sub Do Atr = (WFD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) 'узнаём, является ли найденный файл папкой If TrimNull(WFD.cFileName) <> "." And TrimNull(WFD.cFileName) <> ".." Then If Atr > 0 Then 'если это папка lstFiles.AddItem "[" & Path & TrimNull(WFD.cFileName) & "]" 'добавляем её в список найденных. Else 'если это файл lstFiles.AddItem Path & TrimNull(WFD.cFileName) 'добавляем его в список найденных. End If End If Loop While FindNextFile(hFnd, WFD) FindClose hFnd End Sub
Теперь пробуем поиск - вызываем функцию SearchForFolders: