Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

VB_NET

.pdf
Скачиваний:
9
Добавлен:
22.02.2016
Размер:
3.43 Mб
Скачать

8. Файли

201

 

 

Sub Main()

Dim dr As String = "d:\books"

If Not System.10.Directory.Exists(dr) Then Console.WriteLine("Каталог не існує!") Console.ReadLine()

Exit Sub

End If

Dim di As New System.ІО.DirectoryІnfо(dr) Dim dirs() As System.ІО.DirectoryІnfо

dirs = di.GetDirectories()

Dim і As Integer

For і = 0 To dirs.GetUpperBound(0) Console.WriteLine(dirs(i))

Next

Console.ReadLine()

End Sub End Module

8.8. Класи File і FileInfo

Клас File надає статичні, а клас FileІnfо динамічні

методи створення, копіювання, вилучення, переміщення і сканування файлів. Окрім того, клас FileІnfо успадкував від класу FileSystemІnfo його базові методи і властивості. Здебільшого назви членів цих класів нагадують назви відповід-

них членів класів Directory/DirectoryInfo.

Приклад 8.11. Виведення підкаталогів і файлів каталогу

Imports System.І0

Module Modulel

Sub Main()

Dim dr As String = "d:\books\basic"

Dim di As Directorylnfo

Dim fsi() As FileSystemlnfo

Try

di= New DirectoryІnfо(dr)

202

Програмування мовою Visual Basic.NET

fsi = di.GetFileSystemlnfo()

Catch e As DirectoryNotFoundException Console.WriteLine("Каталог { 0 } не існує!", dr)

Exit Sub End Try

Console.WriteLine(di.FullName) Dim info As FileSystemlnfо

For Each info In fsi Console.WriteLine(info.Name & " " & _

info.CreationTime())

Next

Console.ReadLine()

End Sub End Module

Приклад 8.12. Вилучення файла

Imports System.І0

Module Module1

Sub Main()

Dim fl As String = "d:\test.txt"

If File.Exists(fl) Then

File.Delete(fl)

Console.WriteLine("Файл {0} вилучено!", fl)

Else

Console.WriteLine("Файл {0} не знайдено!", fl)

End If

Console.ReadLine()

End Sub

End Module

Приклад 8.13. Створимо застосування, яке виконує ті ж функції, що й Windows Explorer, використовуючи базові властивості та ме-

тоди класів Directory/DirectoryІnfo і File/FileІnfo. Інтер-

фейс цього застосування проілюстровано на рис. 8.1.

8. Файли

203

 

 

Рис. 8.1. Інтерфейс застосування прикладу 8.12

Форма застосування містить три списки:

DrivesList (елемент керування ComboBoxl) – містить список логічних дисків комп’ютера;

FoldersList (елемент керування ListBoxl) – містить список каталогів поточного логічного диска чи список каталогів обраного у списку каталогу (дві крапки зображають батьківський каталог);

FilesList (елемент керування ListBox2) — містить список усіх файлів поточного каталогу.

Під час виконання процедури опрацювання події Forml_Load (завантаження форми) активізується підпрограма ShowAllDrives(), яка заповнює елемент керування DrivesList назвами логічних дисків комп’ютера.

Процедура опрацювання події Forml_Load (завантаження форми):

Private Sub Forml_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load

ShowAllDrives() ' Заповнення списку логічних дисків

DrivesList.Selectedlndex = 1 ' Вибір диска

Me.Text = Directory.GetCurrentDirectory ' Заголовок

End Sub

204

Програмування мовою Visual Basic.NET

Підпрограма заповнення списку логічних дисків:

Sub ShowAllDrives()

Dim drives() As String

drives = Directory.GetLogicalDrives()

Dim aDrive As String

DrivesList.Items.Clear()

For Each aDrive In drives

DrivesList.Items.Add(aDrive)

Next

End Sub

Під час вибору диска (за домовленістю – першого) активізується процедура опрацювання події DrivesList_SelectedІndexChanged. Ця процедура викликає підпрограму ShowFoldersInDrive, яка заповнює елемент керування FoldersList назвами каталогів обраного диска. Підпрограма отримує назву диска як аргумент параметра drive і виконує скануваня масиву, отриманого з

методу Directory.GetDirectories(drive).

Процедура опрацювання події DrivesList_SelectedlndexChanged:

Private Sub DrivesList_SelectedIndexChanged(ByVal _ sender As System.Object, ByVal e As System.EventArgs) _ Handles DrivesList.SelectedlndexChanged

ShowFoldersInDrive(DrivesList.Text)

End Sub

Підпрограма заповнення списку папок поточного логічного диска:

Sub ShowFoldersInDrive(ByVal drive As String)

Dim folders() As String

Try

folders = Directory.GetDirectories(drive) Catch exception As Exception

MsgBox(exceptіon.Message)

Exit Sub

End Try

8. Файли

205

 

 

Dim fldr As String

FoldersList.Items.Clear()

Dim DI As Directorylnfo

For Each fldr In folders

DI = New DirectoryІnfo(fldr)

FoldersList.Items.Add(DI.Name)

Next

Directory.SetCurrentDirectory(drive)

Me.Text = Directory.GetCurrentDirectory

End Sub

Під час вибору каталогу в елементі керування FoldersList активізується процедура опрацювання події FoldersList_SelectedlndexChanged, яка замінює вміст цього елемента керування списком каталогів, які є в обраному каталозі. Окрім цього, вона виводить позначення батьківського каталогу (..), щоб користувач міг повернутися назад. У кінці процедури викликається підпрограма ShowFileslnFolder(), яка формує список файлів поточного каталогу і відображає їх у списку FilesList.

Процедура опрацювання події FoldersList_SelectedIndexChanged:

Private Sub FoldersList_SelectedIndexChanged(ByVal _ sender As System.Object, ByVal e As System.EventArgs) _

Handles FoldersList.SelectedlndexChanged Dim DI As Directorylnfo

Select Case FoldersList.Text

Case ""

MsgBox("Оберіть каталог!") : Exit Sub Case "." ' Повернення у батьківський каталог

Directory.SetCurrentDirectory("..")

Case Else

Directory.SetCurrentDirectory _ (Directory.GetCurrentDirectory & _ "\" & FoldersList.Text)

Me.Text = Directory.GetCurrentDirectory

End Select

206 Програмування мовою Visual Basic.NET

Dim folders() As String

Dim selectedFolder As String = FoldersList.Text folders = Directory.GetDirectories _

(Directory.GetCurrentDirectory)

FoldersList.Items.Clear()

If Directory.GetCurrentDirectory <> _ Directory.GetDirectoryRoot(selectedFolder) Then _ FoldersList.Items.Add("..")

Dim fldr As String

For Each fldr In folders

DI = New Directorylnfo(fldr)

FoldersList.Items.Add(DI.Name)

Next

ShowFilesInFolder()

End Sub

Підпрограма заповнення списку файлів поточного каталогу:

Sub ShowFilesInFolder()

Dim file As String

Dim FI As FileІnfo

FilesList.Items.Clear()

For Each file In Directory.GetFiles _ (Directory.GetCurrentDirectory)

FI = New Filelnfo(file)

FilesList.Items.Add(FI.Name)

Next

End Sub

8.9. Класи доступу до вмісту файла

Клас FileStream (нащадок класу Stream) надає доступ до файлів, розташованих на диску (створює потік уведення/виведення). Серед конструкторів класу виокремимо найуживаніший:

Sub New(ByVal path As String, ByVal mode As FileMcde, _ ByVal access As FileAccess, ByVal share As FileShare,_

8. Файли

207

 

 

ByVal buffferSize As Integer, ByVal ueAs As Boolean)

Тут path – назва файла, mode – елемент перерахування FileMode (режим відкриття файла), access – елемент перерахування FileAccess (тип доступу), share – елемент перерахування FileShare (тип спільного використання файла), buffersize – розмір буфера і ueAs – відкрити файл для асинхронного введення/виведення.

Метод Seek класу Stream здійснює позиціювання покажчика у файлі:

Public Function Seek(ByVal offset As Long,

ByVal origin As SeekOrigin) As Long

Тут параметр origin набуває значення з перерахування SeekOrigin, елементи якого визначають, чи покажчик знаходитиметься на початку файла (Begin), наприкінці (End) чи у поточній позиції (Current). Параметр offset може набувати як від’ємні, так і додатні значення, і задає зсув місця розташування покажчика щодо позиції, заданої параметром origin.

Метод Read класу Filestream здійснює зчитування з потоку в масив array, починаючи з індексу offset, зазначеної кількості символів count:

Function Read(ByVal array() As Byte, ByVal offset _ As Integer, ByVal count As Integer) As Integer

Клас TextWriter є абстрактним класом, що надає засоби виведення у потік послідовності символів. Головні властивості кла-

су TextWriter:

Close – закриває потік;

Encoding – надає систему декодування;

FormatProvider – надає об’єкт, що контролює форматування;

NewLine – початок нового рядка.

Головні методи класу TextWriter:

Flush – записує всі дані з буферів у відповідні пристрої й очищає усі буфери;

Write – записує зазначені дані у потік виведення;

208

Програмування мовою Visual Basic.NET

WriteLine – записує зазначені дані, за якими надходить команда занесення початку нового рядка у потік виведення.

Клас TextReader є абстрактним класом, що надає засоби читання послідовності символів з потоку. Головні методи класу:

Close – закриває потік;

Peek – повертає наступний символ з потоку, не читаючи його;

Read – зчитує дані з потоку;

ReadBlock – зчитує блок даних з потоку;

ReadLine – зчитує рядок даних з потоку;

ReadToEnd – зчитує всі дані від поточної позиції до кінця потоку.

Класи StreamReader і StreamWriter реалізують методи та властивості абстрактних класів TextReader і TextWriter і надають засоби читання/записування даних у текстовий файл.

Класи StringReader і StringWriter реалізують методи та властивості абстрактних класів TextReader і TextWriter і надають засоби читання/записування рядків символів у текстовий файл.

Клас BinaryReader використовують для побайтового читання даних з файла; a BinaryWriter – для побайтового запису даних у файл.

8.10. Приклади роботи з файлами (на основі обєктної моделі)

Для доступу до вмісту файла потрібно спочатку створити об’єкт класу Stream (noтiк), який зв’язується з конкретним файлом. Після цього формується об’єкт класу Reader або Writer, що базується на даному потоці. Об’єкт класу Stream створюється багатьма методами, що відкривають чи створюють файл.

Об’єкти класів StreamReader/StreamWriter і BinaryRea– der/BinaryWriter дають змогу читати/записувати дані текстових чи двійкових файлів за допомогою об’єкта класу FileStream.

Приклад 8.14. Читання даних з текстового файла за одну операцію

Imports System.ІО

Module Module1

8. Файли

209

 

 

Sub Main()

On Error Resume Next

Dim fl As String = "d:\temp\test.txt" Dim fs As FileStream

Dim sr As StreamReader If File.Exists(fl) Then

fs = New FileStream(fl, FileMode.Open, _ FileAccess.Read)

sr = New StreamReader(fs)

Dim st As String = sr.ReadToEnd() Console.WriteLine(st) Console.ReadLine()

sr.Close() fs.Close ()

End If End Sub End Module

Приклад 8.15. Читання рядків символів з текстового файла

Imports System.ІО

Module Module1

Sub Main()

Dim fl As String = "d:\temp\test.txt" Dim fs As FileStream, sr As StreamReader

fs = New FileStream(f1, FileMode.OpenOrCreate, _ FileAccess.Read)

fs.Seek(0, SeekOrigin.Begin) sr = New StreamReader(fs) Do While sr.Peek > -1

Console.WriteLine(sr.ReadLine())

Loop

Console.ReadLine() : sr.Close() : fs.Close()

End Sub End Module

210 Програмування мовою Visual Basic.NET

Приклад 8.16. Визначення кількості рядків у файлі

Imports System.І0

Module Module1

Sub Main()

On Error Resume Next

Dim fl As String = "d:\temp\test.txt"

Dim fs As FileStream

Dim sr As StreamReader If File.Exists(fl) Then

fs = New FileStream(fl, FileMode.Open, _ FileAccess.Read)

fs.Seek(0, SeekOrigin.Begin) sr = New StreamReader(fs)

Dim і As Integer

While sr.ReadLine() <> Nothing і += 1

End While

MsgBox(Str(i))

sr.Close()

fs.Close()

End If End Sub End Module

Приклад 8.17. Запис/читання рядків символів у текстовому файлі

Imports System.ІО

Module Module1

Sub Main()

On Error Resume Next

Dim fl As String = "d:\temp\test.txt"

Kill(fl)

Dim fs As FileStream

fs = New FileStream(fl, FileMode.OpenOrCreate, _ FileAccess.Write)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]