Классе 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.
|