|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Класі
File
Клас File,
як і клас Directory, складається із загальних методів, яким при виклику зазвичай передається
ім'я файлу. Ці методи пріменяктея при копіюванні, удаленді і
переміщенні файлів. Основні методи класу File перераховані в таблиці. 9.3. Звернете увагу,
- всі параметри передаються за значенням (у таблиці відсутні методи
класу File, призначені для роботи з потоками даних, — вони будуть розглянуті
нижче). Таблиця
9.3.
Основні методи класу File
Операції
з атрибутами файлів і каталогів виконуються достатньо часто, тому в .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. Програма
заносить всі приховані файли заданого каталога в список і продовжує рекурсивну
обробку дерева каталогів. Курсор миші замінюється зображенням пісочного годинника;
за цією ознакою користувач дізнається про те, що програма виконує якусь
тривалу операцію. 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. Форма для
рекурсивного перегляду каталогів
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||