Иллюстрированный самоучитель по VB.NET

       

Рекурсивный просмотр дерева каталогов


Класс 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. Программа заносит все скрытые файлы заданного каталога в список и продолжает рекурсивную обработку дерева каталогов. Курсор мыши заменяется изображением песочных часов; по этому признаку пользователь узнает о том, что программа выполняет какую-то длительную операцию.

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



Рис. 9.1. Форма для рекурсивного просмотра каталогов

Помимо мнврэпоточной реализации при более сложных операциях код процедуры WorkWithFHeslnDir следовало бы заключить в блок Try-Catch.


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