Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2-й семестр / Лекции / Тема 6.3 Работа с файлами в C#.ppt
Скачиваний:
96
Добавлен:
12.03.2016
Размер:
906.24 Кб
Скачать

Программирование

Тема 6.3 Работа с файлами в C#

1

Классы File и FileInfo

Пример 1: Получение информации о файле, копирование и удаление файла

2

Классы File и FileInfo

С помощью классов File и FileInfo можно создавать, удалять, перемещать файлы, получать их свойства и многое другое.

Некоторые полезные методы и свойства класса FileInfo:

CopyTo(newpath): копирует файл в новое место по указанному пути newpath

Create(): создает файл

Delete(): удаляет файл

MoveTo(newpath): перемещает файл в новое место

Свойство Exists: указывает, существует ли файл

Свойство Length: получает размер файла

Свойство Extension: получает расширение файла

Свойство Name: получает имя файла

Свойство FullName: получает полное имя файла

Класс File реализует похожую функциональность с помощью статических методов:

Copy(path, newpath): копирует файл в новое место

Create(path): создает файл

Delete(path): удаляет файл

Move(path, newpath): перемещает файл в новое место

Exists(path): определяет, существует ли файл по указанному пути path

Метод CopyTo класса FileInfo принимает два параметра: путь, по которому файл будет копироваться, и булевое значение, которое указывает, надо ли при копировании перезаписывать файл (если true, файл при копировании перезаписывается). Если же в качестве последнего параметра передать значение false, то если такой файл уже существует, приложение выдаст ошибку.

Метод Copy класса File принимает три параметра: путь к исходному файлу, путь, по которому файл будет копироваться, и булевое значение, указывающее, будет ли файл перезаписываться.

3

Класс FileStream

Пример 2:

4

Класс FileStream

Пример 2:

5

Класс FileStream

Класс FileStream представляет возможности по считыванию из файла и записи в файл. Рассмотрим наиболее важные его свойства и методы:

Свойство Length: возвращает длину потока в байтах

Свойство Position: возвращает текущую позицию в потоке

Метод Read: считывает данные из файла в массив байтов. Принимает три параметра: int Read(byte[] array, int offset, int count) и возвращает количество успешно считанных байтов array - массив байтов, куда будут помещены считываемые из файла данные

offset - смещение в байтах в массиве array, в который считанные байты будут помещены

count - максимальное число байтов, предназначенных для чтения. Если в файле находится меньшее количество байтов, то все они будут считаны.

Метод long Seek(long offset, SeekOrigin origin): устанавливает позицию в потоке со смещением на количество байт, указанных в параметре offset.

Метод Write: записывает в файл данные из массива байтов. Принимает три параметра: Write(byte[] array, int offset, int count)

array - массив байтов, откуда данные будут записываться в файла

offset - смещение в байтах в массиве array, откуда начинается запись байтов в поток count - максимальное число байтов, предназначенных для записи

FileStream представляет доступ к файлам на уровне байтов, поэтому, например, если надо считать или записать одну или несколько строк в текстовый файл, то массив байтов надо преобразовать в строки, используя специальные методы. Поэтому для работы с текстовыми файлами применяются другие классы.

В то же время при работе с различными бинарными файлами, имеющими определенную структуру FileStream может быть очень даже полезен для извлечения определенных порций информации и

ееобработки.

В примере 2 выполняется считывание-запись в текстовый файл.

6

Класс FileStream

Разберем пример 2. Объект fstream1 создается через конструктор, а объект fstream2 - через один из

статических методов класса File. Здесь в конструктор передается два параметра: путь к файлу и перечисление FileMode. Данное перечисление указывает на режим доступа к файлу и может принимать следующие значения:

Append: если файл существует, то текст добавляется в конец файл. Если файла нет, то он создается. Файл открывается только для записи.

Create: создается новый файл. Если такой файл уже существует, то он перезаписывается

CreateNew: создается новый файл. Если такой файл уже существует, то он приложение выбрасывает ошибку

Open: открывает файл. Если файл не существует, выбрасывается исключение

Create: создается новый файл. Если такой файл уже существует, то он перезаписывается

OpenOrCreate: если файл существует, он открывается, если нет - создается новый

Truncate: если файл существует, то он перезаписывается. Файл открывается только для записи.

Статический метод OpenRead класса File открывает файл для чтения и возвращает объект FileStream.

Конструктор класса FileStream также имеет ряд перегруженных версий, позволяющий более точно настроить создаваемый объект. Все эти версии можно посмотреть на msdn.

И при записи, и при чтении применяется объект кодировки Encoding.Default из пространства

имен System.Text. В данном случае мы используем два его метода: GetBytes для получения массива байтов из строки и GetString для получения строки из массива байтов.

В итоге введенная строка записывается в файл. По сути это бинарный файл (не текстовый), хотя если в него записать только строку, то можно посмотреть в удобочитаемом виде этот файл, открыв его в текстовом редакторе. Однако если в него записать случайные байты, например: fstream1.WriteByte(13);

fstream1.WriteByte(103);, то могут возникнуть проблемы с его пониманием. Поэтому для работы непосредственно с текстовыми файлами предназначены отдельные классы - StreamReader и StreamWriter.

7

Классы StreamReader и StreamWriter

Пример 3: Чтение из файла и StreamReader

8

Классы StreamReader и StreamWriter

Пример 3: Чтение из файла и StreamReader

9

Классы StreamReader и StreamWriter

Класс FileStream не очень удобно применять для работы с текстовыми файлами. К тому же для этого в пространстве System.IO определены специальные классы: StreamReader и StreamWriter.

Класс StreamReader позволяет легко считывать весь текст или отдельные строки из текстового файла. Среди его методов можно выделить следующие:

Close: закрывает считываемый файл и освобождает все ресурсы

Peek: возвращает следующий доступный символ, если символов больше нет, то возвращает -1

Read: считывает и возвращает следующий символ в численном представлении. Имеет перегруженную версию: Read(char[] array, int index, int count), где array - массив, куда считываются символы, index - индекс в массиве array, начиная с которого записываются считываемые символы, и count - максимальное количество считываемых символов

ReadLine: считывает одну строку в файле

ReadToEnd: считывает весь текст из файла

В примере 3 используется оператор using. Не надо путать данный оператор с директивой using, которая подключает пространства имен в начале файла кода. Оператор using позволяет создавать объект в блоке кода, по завершению которого вызывается метод Dispose у этого объекта, и, таким образом, объект уничтожается. В данном случае в качестве такого объекта служит переменная sr.

В примере 3 текст из файла считывается различными способами.

В первом случае считывается весь текст с помощью метода ReadToEnd().

Во втором случае считывается построчно через цикл while: while ((line = sr.ReadLine()) != null) - сначала присваиваем переменной line результат функции sr.ReadLine(), а затем проверяем, не равна ли она null. Когда объект sr дойдет до конца файла и больше строк не останется, то метод sr.ReadLine() будет возвращать null.

В третьем случае считывается в массив четыре символа.

Замечание.

В

последних

двух

случаях

в

конструкторе

StreamReader

указывалась

кодировка System.Text.Encoding.Default.

Свойство

Default класса Encoding получает

кодировку для

текущей кодовой страницы ANSI. Также через другие свойства мы можем указать другие кодировки. Если кодировка не указана, то при чтении используется UTF8. Иногда важно указывать кодировку, так как она

может отличаться от UTF8, и тогда мы получим некорректный вывод.

10