VB_NET
.pdf8. Файли |
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)