Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab_11-12.docx
Скачиваний:
4
Добавлен:
06.11.2018
Размер:
81.92 Кб
Скачать

3. Основні операції з файлами

Щоб видалити файл, можна скористатися статичним методом

Sub Delete (ByVal path As String)

класу File або динамічним методом класу Fileinfo

Sub Delete ().

Створимо консольний додаток, який дозволить видаляти файл, використовуючи статичний метод. Щоб уникнути помилок при виконанні програми, будемо перевіряти файл, що видаляється на існування з допомогою методу Exists класу File. Процедура Main програми буде мати наступний вигляд:

Sub Main()

Dim fileName As String = "C:\MyFile.txt"

If File.Exists(fileName) Then

File.Delete(fileName)

Else : Console.WriteLine("Файл не існує")

Console.ReadLine()

End If

End Sub

Для переміщення файлу можна використовувати статичний метод

Sub Move (ByVal sourceFileName As String, ByVal destFileName As String)

класу File або динамічний метод

Sub MoveTo (ByVal destFileName As String)

класу Fileinfo, де SourceFileName – повне ім'я переміщуваного файлу; destFileName – нове ім'я файлу і повний шлях до нього.

В результаті виконання методів створюється новий файл, в який копіюється вміст переміщуваного. При цьому вихідний файл видаляється. У випадку, коли файл з ім'ям destFileName вже існує, генерується помилка.

Напишемо програму, яка дозволить переміщати файл і буде перевіряти існування зазначених файлів. Для цього необхідно створити консольний додаток і додати в нього наступний код:

Sub Main()

Dim sourceFileName As String = "C:\MyFile.txt"

Dim destFileName As String = "D:\MyFile.txt"

MoveFile(sourceFileName, destFileName)

End Sub

Sub MoveFile(ByVal sourceName As String, ByVal destName As String)

If File.Exists(sourceName) Then

If Not File.Exists(destName) Then

File.Move(sourceName, destName)

Else

Console.WriteLine("Файл {0} существует", destName)

Console.ReadLine()

End If

Else

Console.WriteLine("Файл {0} не существует", sourceName)

Console.ReadLine()

End If: End Sub

Щоб скопіювати файл використовуються метод

Sub Copy (ByVal sourceFileName As String, ByVal destFileName As String, ByVal overwrite As Boolean)

класу File і метод

Function CopyTo (ByVal destFileName As String, ByVal overwrite As Boolean) As Fileinfo

класу FileInfo, де sourceFileName – повне ім'я копіюємого файлу; destFileName – нове ім'я файлу і повний шлях до нього; overwrite – параметр, що визначає, чи можна переписувати файл призначення, якщо він вже існує. Якщо файл існує і параметр overwrite не приймає значення True, буде генеруватися помилка. Ці методи дозволяють створювати новий файл або перезаписувати існуючий копіюванням початкового.

Створимо консольний додаток, яке дозволить копіювати файл за допомогою методу Copy класу File і дозволить перезапис. Додамо до програми наступний код:

Sub Main()

Dim sourceFileName As String = "C:\MyFile.txt"

Dim destFileName As String = "D:\MyFile.txt"

CopyFile(sourceFileName, destFileName)

End Sub

Sub CopyFile(ByVal sourceName As String, ByVal destName As String)

If File.Exists(sourceName) Then

File.Copy(sourceName, destName, True)

Else

Console.WriteLine("Файл {0} не существует", sourceName)

Console.ReadLine()

End If

End Sub

Для створення файлів застосовується метод

Function Create (ByVal path As String) As FileStream

а для перезапису або створення нового текстового файлу – метод

Function CreateText (ByVal path As String) As StreamWriter,

де path - повне ім'я файлу, що включає ім'я файлу і повний шлях до нього. Якщо файл з ім'ям path вже існує, то він перезаписується і вся що зберігається в ньому інформація видаляється. Обидва методи належать класу File.

Створимо новий текстовий файл, використовуючи статичний метод create класу File. Для цього необхідно створити консольний додаток і додати в програму наступний код:

Sub Main()

Dim fileName As String = "C:\Example.txt"

CreateFile(fileName)

End Sub

Sub CreateFile(ByVal fileName As String)

If Not File.Exists(fileName) Then

Dim fs As FileStream

fs = File.Create(fileName)

fs.Close()

Else : Console.WriteLine("Файл уже существует")

Console.ReadLine()

End If

End Sub

Дані методи відкривають файл и потік FileStream, який необхідно закрити після завершення. З цією метою використовується метод close класу FileStream.

Для створення файлу можна також застосовувати однойменні динамічні методи класу Fileinfo.

Function Create () As FileStream

Function CreateText () As StreamWriter

Зрозуміло, що перед тим як записати дані у файл або прочитати дані з файлу, необхідно спочатку цей файл відкрити. Для відкриття файлу використовується метод класу File

Function Open (ByVal path As String, ByVal mode As FileMode, ByVal access As FileAccess, ByVal share As FileShare) As FileStream

де path – повне ім'я файлу, що включає саме ім'я файлу і шлях до нього; mode – режим доступу до файлу. Може приймати значення

Append – Якщо файл існує, то відкриває його і переміщує курсор у кінець файлу або створює новий файл. Файл може бути відкритий тільки для запису.

Create – Створює новий файл. Якщо файл вже існує, то переписує його

CreateNew – Створює новий файл. У разі існування файлу генерує помилку

Open – Відкриває файл. Якщо файл не існує, то формує виключення

OpenOrCreate – Якщо файл існує, то відкриває його, інакше створює новий

Truncate – Якщо файл існує, то переписує його. Файл відкривається тільки для запису

access – тип доступу до файлу. Визначає характер дій з файлом (читання або запис даних). Може приймати значення: Read (Читання), write (Запис) або ReadWrite (Читання і запис). Цей параметр можна опустити, тоді за замовчуванням тип доступу буде приймати значення ReadWrite;

share - тип дозволу доступу до файлу іншим процесам. Визначає можливість одночасної роботи з файлом декількох додатків або декількох користувачів. Може приймати значення: inheritable (Спадковий доступ), None (Немає доступу), Read (Читання), ReadWrite (Читання і запис) або write (Запис). Цей параметр задається тільки у випадку, коли зазначений тип доступу access. Крім того, параметр share можна опустити, тоді за замовчуванням він буде приймати значення None.

Більш того, можна відкрити файл лише для читання за допомогою методів

Function OpenRead (ByVal path As String) As FileStream

Function OpenText (ByVal path As String) As StreamReader

Щоб відкрити файл тільки для запису, можна скористатися методом

Function OpenWrite (ByVal path As String) As FileStream

Клас FileInfo має аналогічні методи за тим винятком, що ім'я файлу, що відкривається задається при створенні екземпляра класу і тому в методах параметр path опускається.

Розглянемо консольний додаток, який дозволяє відкрити один файл для додавання даних у кінець файлу, а другий файл тільки для читання. Для цього додайте наступний код:

Sub Main()

Dim filenamel As String = "C:\MyFile.txt"

Dim fileName2 As String = "D:\MyFile.txt"

OpenAppendFile(filenamel)

OpenReadOnlyFile(fileName2)

End Sub

Sub OpenAppendFile(ByVal fileName As String)

Dim fileAppendStream As FileStream

Try

fileAppendStream = File.Open(fileName, FileMode.Append, FileAccess.Write)

Catch e As Exception

Console.WriteLine("Ошибка при открытии файла {0}", fileName)

Console.ReadLine()

End Try

fileAppendStream.Close()

End Sub

Sub OpenReadOnlyFile(ByVal fileName As String)

Dim fileReadStream As StreamReader

If File.Exists(fileName) Then

fileReadStream = File.OpenText(fileName)

Else : Console.WriteLine("Файл {0} не существует ", fileName)

Console.ReadLine()

End If

fileReadStream.Close()

End Sub

Для закриття потоків введення / виведення застосовуються fileReadStream.Close i FileAppendStream.Close.

При зчитуванні даних з файлу і запису в нього часто потрібно задати позицію, з якої буде виконуватися та чи інша операція. З цією метою використовується метод класу stream:

Function Seek (ByVal offset As Long, ByVal origin As SeekOrigin) As Long

де offset – зміщення покажчика щодо позиції, заданої параметром origin, origin – параметр, що визначає позицію, в якій буде знаходитися покажчик. Може приймати одне зі значень перерахування SeekOrigin: Begin (На початку файлу), current (У поточній позиції) або End (В кінці файлу).

Для зчитування даних з текстового файлу можна використовувати різні методи залежно від того, потрібно зчитати дані порядково, блоками або всі дані цілком.

У випадку, коли необхідно зчитати весь файл, вдаються до методу ReadToEnd класу StreamReader.

Розглянемо приклад, в якому спочатку відкривається потік для читання, потім за допомогою методу ReadToEnd вся інформація з файлу зчитується і виводиться на екран і потік закривається. Для цього створіть консольний додаток і додайте в нього наступний код:

Sub Main()

Dim fileName As String = "C:\MyFile.txt"

ReadFile(fileName)

End Sub

Sub ReadFile(ByVal filename As String)

If File.Exists(filename) Then

Dim sr As New StreamReader(filename)

Dim text As String

text = sr.ReadToEnd()

Console.WriteLine(text)

sr.Close()

Else : Console.WriteLine("Файл не существует")

End If

Console.ReadLine()

End Sub

Для зчитування окремих рядків файлу призначений метод ReadLine класу StreamReader.

Змінимо процедуру ReadFile з попереднього прикладу так, щоб дані з файлу зчитувалися не цілком, а порядково. Для цього скористаємося методом ReadLine і оператором Do Until, використання якого дозволить вважати всі рядки файлу. Тоді текст процедури ReadFile буде мати вигляд:

Sub ReadFile(ByVal fileName As String)

If File.Exists(fileName) Then

Dim sr As StreamReader

Dim text As String

sr = File.OpenText(fileName)

text = sr.ReadLine()

Do

text = sr.ReadLine()

Console.WriteLine(text)

Loop Until (text = Nothing)

sr.Close()

End If

End Sub

У випадку, коли потрібно отримати декілька символів файлу, можна скористатися методом Read класу streamReader. Наприклад, зчитаємо п'ять перших символів текстового файлу. Для завдання позиції, з якою починається зчитування даних, будемо використовувати метод Seek.

Sub ReadFile(ByVal fileName As String)

If File.Exists(fileName) Then

Dim sRead As Stream

sRead = File.OpenRead(fileName)

Dim strReader As New StreamReader(sRead, System.Text.Encoding.ASCII)

strReader.BaseStream.Seek(0, SeekOrigin.Begin)

Dim buffer(4) As Char

strReader.Read(buffer, 0, 5)

Console.Write(buffer)

Console.ReadLine()

strReader.DiscardBufferedData()

strReader.Close()

End If

End Sub

Так як метод Read не оновлює поточну позицію потоку, екземпляр классу streamReader повертає більше символів, ніж реально. Щоб позбутися від цих даних, слід скористатися методом DiscardBufferedData.

Запис даних у текстовий файл здійснюється за допомогою методів write і WriteLine класу streamwriter. Розглянемо приклад, який дозволить записувати різні дані у файл:

Sub Main()

Dim fileName As String = "C:\MyFile.txt"

WriteFile(fileName)

End Sub

Sub WriteFile(ByVal fileName As String)

Dim fs As New FileStream(fileName, FileMode.OpenOrCreate)

Dim sw As New StreamWriter(fs)

Dim b() As Char = {"0", "h", "e", "1", "1", "o", "!", "0"}

Dim str As String = "8*9="

Dim c As Integer = 72

sw.WriteLine(b, 1, 6)

sw.Write(str)

sw.Write(c)

sw.Close()

fs.Close()

End Sub

В результаті виконання даної процедури файл MyFile.txt буде містити:

hello! 8 * 9 = 72

Простір імен System.IO дозволяє при роботі з файлами застосовувати побайтові операції. Класи BinaryReader і BinaryWriter надають можливість записувати і зчитувати певну кількість байтів інформації. Методи даних класів забезпечують роботу з файлами, дані яких мають такі типи, як Boolean, Byte, Char, Decimal, Double, integer, single, string. При цьому зовсім не обов'язково, щоб файл був текстовим. При використанні побайтових операцій з файлами часто прибігають до методу seek, що дозволяє встановити розташування покажчика у файлі.

Розглянемо використання методів Read і Write класів BinaryReader і BinaryWriter на невеликому прикладі, переписують дані з одного файлу в інший. Для цього створіть консольний додаток і додайте в програму наступний код:

Sub Main()

Dim sourceFileName As String = "C:\MyFile.txt"

Dim destFileName As String = "D:\MyFile.txt"

ByteOperations(sourceFileName, destFileName)

End Sub

Sub ByteOperations(ByVal sourceName As String, ByVal destName As String)

If File.Exists(sourceName) Then

Dim sourceFileStream As New FileStream(sourceName, FileMode.Open)

Dim destFileStream As New FileStream(destName, FileMode.Create)

Dim bReader As New BinaryReader(sourceFileStream)

Dim bWriter As New BinaryWriter(destFileStream)

Dim text As Byte

bReader.BaseStream.Seek(0, SeekOrigin.Begin)

While (bReader.BaseStream.Position < bReader.BaseStream.Length)

text = bReader.ReadByte()

bWriter.Write(text)

End While

sourceFileStream.Close()

destFileStream.Close()

bReader.Close()

bWriter.Close()

End If

End Sub

У наведеному прикладі з допомогою методу ReadByte ми зчитували з файлу по одному байту інформації. Якщо необхідно зчитувати задане число байтів, можна скористатися методом ReadBytes, який у якості параметра містить число байтів.

При зчитуванні даних різних типів можна скористатися одним з методів

ReadBoolean – Зчитує дані типу Boolean з потоку і переміщують покажчик на один байт

ReadByte – Зчитує наступний байт з поточного потоку і переміщує покажчик на один байт

ReadChar – Зчитує наступний символ з потоку і переміщує покажчик відповідно з кодуванням і символом, що прочитується з потоку

ReadDecimal – Зчитує десяткову величину з потоку і змінює поточну позицію на 6 байтів

ReadDouble – Зчитує 8-байтову величину з плаваючою точкою з потоку і змінює поточну позицію на 8 байтів

Readlntl6, Readlnt32, Readlnt64 – Зчитує 2 -, 4 - або 8-байтове ціле знакова число з потоку і переміщає покажчик на 2, 4 або 8 байтів, відповідно

ReadSByte – Зчитує знаковий байт з поточного потоку і переміщують покажчик на один байт

ReadSingle – Зчитує 4-байтове величину з плаваючою точкою з потоку і змінює поточну позицію на 4 байти

ReadSting – Зчитує послідовність символів з потоку, включаючи зазначену на початку файлу довжину, що представляє собою 7-бітове ціле

ReadUIntl6, ReadUInt32, ReadUInt64 – читує 2 -, 4 - або 8-байтове ціле беззнакове число з потоку і переміщає покажчик на 2, 4 і 8 байтів, відповідно

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