Рекурсивное сканирование папки
Рекурсивное сканирование папки (сканирование файлов папки и ее подпапок на произвольную глубину) - это стандартная операция при программировании файловой системы. В гл. 11 было показано, как рекурсивно сканировать папку, используя элементы управления File System (элементы управления DriveListBox, DirectoryListBox и FileListBox). В гл. 8 было создано приложение, которое заполняет элемент управления TreeView содержимым устройства или папки. Древовидная структура идеальна для представления папки, потому что папка является древовидной структурой. В проекте Explorer при использовании объекта FileSystemObject мы обещали вернуться к пояснению работы проекта.
В этом параграфе рассмотрено приложение FSystem, которое заполняет элемент управления TreeView папками диска С. Для отображения содержимого другого устройства или папки внесите в код соответствующие изменения. Форма приложения FSystem показана на рисунке 20.3. Запустите приложение и щелкните на кнопке Populate Tree, чтобы увидеть структуру папок диска С: в окне элемента управления TreeView. Время реакции приложения зависит от количества папок в корневом каталоге устройства. Будьте терпеливы или измените код для просмотра меньшего количества папок.
Рис. 20.3. Приложение FSystem: некоторые методы объекта FileSystemObject
Начнем с простой версии приложения, которая выводит имена папок в окно проверки. Затем заменим оператор Debug. Print соответствующими операторами для добавления имен папок в элемент Tree View.
Программа 20.4. Сканирование диска с помощью объекта FileSystemObject
Dim FSys As New Scripting.FileSystemObject
Private Sub Command1_Click()
Dim folderSpec As String
Set FSys = CreateObject ("Scripting.FileSystemObject")
' В следующей строке укажите папку, которую необходимо видеть
folderSpec = "с:\"
ScanFolder(folderSpec)
Debug.Print "*** Конец списка объектов каталога ***"
End Sub
Sub ScanFolder(folderSpec As String)
Dim thisFolder As Folder
Dim sFolders As Folders
Dim fileItem As File, folderItem As Folder
Dim AllFiles As Files
Set thisFolder = FSys.GetFolder(folderSpec)
Set sFolders = thisFolder.SubFolders
Set AllFiles = thisFolder.Files
For Each folderItem In sFolders
Debug.Print
Debug.Print "*** ПАПКА " & folderltem.Path & "***"
ScanFolder (folderItem.Path)
Next
For Each fileItem In AllFiles
Debug.Print fileItem.Path
Next
End Sub
Обработчик события Click кнопки Command 1 вызывает подпрограмму ScanFolder(), чтобы просканировать папку, имя которой передается в качестве аргумента. ScanFolder() создает объектную переменную thisFolder, которая задает текущую папку. Затем программа создает семейство подпапок из сканируемой папки. Это семейство - sFolder -
сканируется, и имена подпапок отображаются в окне проверки. После вывода на экран имени текущей папки подпрограмма ScanFolder() рекурсивно вызывается для сканирования подпапок текущей папки. После сканирования текущей папки, включая ее подпапки, программа отображает файлы в текущей папке, используя семейство AllFiles.
В версии программы FSystem на компакт-диске операторы, выполняющие вывод в окно проверки, закомментированы и добавлены операторы, помещающие имена папок и файлов в элемент управления TreeView.
Программа 20.5. Заполнение элемента TreeView
Dim FSys As New Scripting.FileSystemObject
Private Sub Coininandl_Click ()
Dim folderSpec As String
Set FSys = CreateObject("Scripting.FileSystemObject")
' В следующей строке укажите папку, которую хотите увидеть
folderSpec = "c:\wind"
folderSpec = UCase(folderSpec)
TreeView1.Nodes.Add, ,folderSpec, folderSpec
Screen.MousePointer = vbHourglass
ScanFolder (folderSpec)
Screen.MousePointer = vbDefauit
TreeView1.Nodes(1).Expanded = True
MsgBox "File List created"
' (Список файлов создан)
End Sub
Sub ScanFolder(folderSpec As String)
Dim thisFolder As Folder
Dim sFolders As Folders
Dim fileItem As File, folderItem As Folder
Dim AllFiles As Files
Set thisFolder = FSys.GetFolder(folderSpec)
Set sFolders = thisFolder.SubFolders
Set AllFiles = thisFolder.Files
For Each folderItem In sFolders
TreeView1.Nodes.Add folderItem.ParentFolder.Path, _
tvwChild, folderItem.Path, folderItem.Name
ScanFolder (folderItem.Path)
Next
For Each fileItem In AllFiles
TreeView1.Nodes.Add fileItem.ParentFolder.Path, _
tvwChild, fileItem.Path, fileItem.Name
Next
End Sub
Заметьте, как метод Add элемента управления TreeView добавляет папку и имена файлов в надлежащее место в дереве. Узел каждой папки является потомком узла родительской папки. Выражение folderltem.ParentFolder.Path является именем текущего пути и используется как ключ узла. Ключ каждого элемента -это имя полного пути к нему, поэтому ключи файлов с одинаковыми именами из различных папках будут помещены в требуемую позицию в дереве.
Код проекта FSystem легко модифицировать, чтобы заполнить элемент TreeView не всеми именами файлов, а только именами выделенных файлов. Критерием для выделения могут быть атрибуты файлов, например, его размер, тип и т.д. Можно выбрать файлы с изображениями, размер которых превышает 100 Кб. Или текстовые файлы, которые не использовались в течение месяца, и т.д.