Visual Basic 6. Руководство разработчика

       

Рекурсивное сканирование папки


Рекурсивное сканирование папки (сканирование файлов папки и ее подпапок на произвольную глубину) - это стандартная операция при программировании файловой системы. В гл. 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 Кб. Или текстовые файлы, которые не использовались в течение месяца, и т.д.


Содержание раздела