![]() |
![]() |
![]() |
Классе
File
Класс File,
как и класс Directory, состоит из общих методов, которым при вызове обычно передается
имя файла. Эти методы применяктея при копировании, удалении
и перемещении файлов. Основные методы класса File перечислены в табл. 9.3. Обратите
внимание,— все параметры передаются по значению (в таблице отсутствуют методы
класса File, предназначенные для работы с потоками данных, — они будут рассмотрены
ниже).
Таблица
9.3. Основные методы класса File
Метод |
Описание |
||
Copy(ByVal sourceFiteName
As String,ByVal destFileName As String) |
Копирует файл.
Существует перегруженная версия метода с третьим логическим параметром
overwrite; если этот параметр равен True, существующий файл с заданным
именем перезаписывается |
||
Delete(ByVal
path As String) |
Удаляет заданный
файл. Интересная подробность: если файл не существует, исключение
не инициируется (см. описание метода Exists) |
||
Exists(ByVal
path As String) |
Возвращает логическую
величину, которая показывает, существует ли файл с заданным полным
именем |
||
GetAttributes(ByVal
path As String) |
Возвращает значение
перечисляемого типа FileAttributes с описанием атрибутов файла — архивный,
системный и т. д. (о том, как использовать полученный объект, рассказано
в следующем разделе) |
||
GetCreationTime
(ByVal path As String) |
Возвращает объект
даты, содержащий информацию о времени создания файла |
||
GetLastAccessTime
(ByVal path As String) |
Возвращает объект
даты, содержащий информацию о времени последнего обращения к файлу |
||
GetLastWriteTime
(ByVal path As String) |
Возвращает объект
даты, содержащий информацию о времени последней записи в файл |
||
Move(ByVal sourceFileName
As String, ByVal destFileName As String) |
Перемещает файл
(поддерживается возможность перемещения на другой диск) и переименовывает
его, если в параметре destFileName указано новое имя |
||
SetAttributes(ByVal
path As String, ByVal fileAttributes As FileAttributes) |
Задает атрибуты
указанного файла |
||
Операции
с атрибутами файлов и каталогов выполняются достаточно часто, поэтому в .NET
Framework был включен удобный класс FileAttri bute. Вероятно, правильнее было
бы назвать его FileDi rectoryAttri bute, поскольку все атрибуты относятся не
только к файлам, но и к каталогам.
Значения
перечисляемого типа обычно объединяются поразрядными операциями, чтобы избежать
всевозможных ошибок в программе. Не используйте команды следующего вида:
If File.GetAttributes("c:\foo.txt")
= FileAttributes.Readonly Then...
В проверяемом
условии не учитывается тот факт, что у файла могут быть установлены и другие
атрибуты. Правильная команда должна выглядеть так:
If File.GetAttributes("c:\foo.txt") And FileAttributes.Readonly _
= FileAttributes.Readonly
Then...
При необходимости
атрибуты объединяются оператором Оr. Пример:
File.SetAttributes(
"с: \foo.txt".
Not (FileAttributes.Archive)
Or FileAttributes.Hidden)
Команда назначает
атрибуты C:\foo.txt таким образом, что файл становится скрытым (Hidden), а архивный
бит (Archive) сбрасывается. Ниже перечислены важнейшие значения этого перечисляемого
типа:
Archive
Compressed
Di rectory
Encrypted
Hidden
Normal (атрибуты
не установлены)
Readonly
System
Классы
DirectoryInfo и FileInfo
В отличие
от обобщенных классов Directory и Filе классы Directory Info и FileInfо инкапсулируют
конкретные (или потенциально существующие) каталоги и файлы. Чтобы использовать
их, необходимо предварительно создать экземпляр класса. Под потенциальным существованием
мы имеем в виду, что объект Di rectorylnfo или Fi lelnfo может быть создан даже
в том случае, если файл или каталог с заданным именем еще не существует и создается
при последующем вызове метода Create.
Как правило,
при создании экземпляров этих классов при вызове конструктора указывается имя
каталога или файла. Пример:
Dim myDirectory
As Directorylnfo
myDirectory
= New Directorylnfo("C:\Test Directory")
Текущий каталог
обозначается символом «.»:
Dim currentDir
As New Directorylnfo(".")
После создания
объекта Directorylnfo можно запросить различные сведения о соответствующем каталоге
— например, время создания:
MsgBox(myDirectory.GreatienTime)
Как упоминалось
выше, одна из самых замечательных особенностей этих классов заключается в том,
что их члены возвращают объекты, а не строки. Например, в следующей программе
вызов GetFiles в выделенной строке возвращает коллекцию объектов Filelnfo, что
позволяет при необходимости вызвать методы этих объектов.
Imports System.IO
Module Modulel
Sub Main()
Dim myDi rectory
As Directorylnfo Try
myDirectory
=New DirectoryInfo("C:\Test Directory")
Dim aFile As
File Info
For Each aFile
In myDirectory.GetFiles
Consol e. WriteLi ne( "The fi1e named " & aFile. Full Name & _
"has length
" & aFile.Length) Next Catch e As Exception
MsgBox("eeks
-an exception " & e.StackTrace) Finally
Console.WriteLine("Press enter to end")
Console.ReadLine()
End Try
End Sub
End Module
Рекурсивный
просмотр дерева каталогов
Класс 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.
![]() |
![]() |
![]() |