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