Рекурсивный просмотр дерева каталогов
Класс Directorylnfo удобен тем, что на его основе легко строятся обобщенные процедуры для рекурсивного перебора дерева каталогов. Как было показано в главе 4, при этом удобно использовать вспомогательную процедуру, которая, в свою очередь, вызывает другую процедуру для работы с файлами заданного каталога. Ниже приведена одна из возможных реализаций этого рекурсивного процесса:
Option Strict On Imports System.IO Module Modulel SubMain() Dim nameOfDirectory As String ="C:\" Dim myDirectory As DirectoryInfo myDirectory = New DirectoryInfo(nameOfDirectory) WorkWithDirectory(myDirectory) End Sub Public Sub WorkWithDirectory(ByVal aDir As Directorylnfo) Dim nextDir As Directorylnfo WorkWithFilesInDir(aDir) For Each nextDir In aDir.GetDirectories WorkWithDirectory(nextDir) Next End Sub Public Sub WbrkWithFilesInDir(ByVal aDir As Directorylnfo) Dim aFile As Filelnfo For Each aFile In aDir.GetFiles() ' Выполнить операцию с файлом. ' В нашем примере просто выводится уточненное имя. Consolе.WriteLine(aFi1e.Ful1 Name) Next End Sub End Module
Следующий, более реалистичный пример активизирует форму, показанную на рис. 9.1. Программа заносит все скрытые файлы заданного каталога в список и продолжает рекурсивную обработку дерева каталогов. Курсор мыши заменяется изображением песочных часов; по этому признаку пользователь узнает о том, что программа выполняет какую-то длительную операцию.
Рис. 9.1. Форма для рекурсивного просмотра каталогов
Примечание
В действительности эту программу следовало бы реализовать в многопоточной модели, чтобы форма реагировала на действия пользователя, – о том, как это делается, рассказано в следующей главе. Конечно, проблему можно решить включением команды DoEvents в код обновления списка, однако многопоточное решение выглядит более профессионально.
Private Sub Buttonl_Click(ByVal sender As System.Object,_ ByVal e As System.EventArgs) Handles Buttonl.Click 'Заменить курсор изображением песочных часов Me.Cursor = Cursors.WaitCursor ListBoxl. Items. Clear() WorkWithDirectory(New Directorylnfo(TextBoxl.Text)) Me.Cursor = Cursors.Default End Sub Public Sub WorkWithDirectory(ByVal aDir As Directorylnfo) Dim nextDir As Directorylnfo Try WorkWithFilesInDir(aDir) For Each nextDir In aDir.GetDirectories WorkWithDirectory(nextDi r) Next Catch e As Exception MsgBox(e.message SvbCrLf Se.StackTrace) End Try End Sub Public Sub WorkWithFilesInDir(ByVal aDir As Directorylnfo) Dim aFile As Filelnfo For Each aFile In aDir.GetFiles() If aFile.Attributes And _ FileAttributes.Hidden = FileAttributes.Hidden Then ListBoxl. Items. Add("FOUND hidden filenamed " & aFile. FullName) End If Next End Sub
Примечание
Помимо многопоточной реализации при более сложных операциях код процедуры WorkWithFHeslnDir следовало бы заключить в блок Try-Catch.