Cамоучитель по VB.NET

Онлайн консультация адвоката бесплатно, юридические услуги .


 

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

 

Назад Начало Вперед