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

Вопрос 20 Потоки данных и файловый ввод-вывод. Виды файлов.

Потоки обрабатывают ввод и вывод данных программы. Входной поток можно рассматривать, как последовательность байтов, входящих в программу из устройства-ис­точника, а выходной — как последовательность байтов, попадающих из программы на устройство-приемник.

В языке С# и библиотеке .NET, потоки данных представлены отдельными объекта­ми из классов, находящихся в пространстве имен System.IO.

Потоки иже знакомы нам. Так, например, знакомый читателю метод Console.ReadLine по умолчанию читает дан­ные стандартного потока (объекта одного из классов System.IO, передающего символы, набираемые на клавиатуре, в используемую программу). Аналогичным образом, метод Console.WriteLine по умолчанию записывает данные стандартного потока, при выводе символов на экран.

Классы потоков System.IO эффективно ограждают программиста от обилия низко­уровневых деталей, связанных с устройствами ПК и его операционной системой. Это не только в значительной степени облегчает выполнение операций ввода-вывода, но и предоставляет стандартизированный, не зависящий от состояния устройств, способ вы­полнения операций с потоками. Такие программы намного проще в поддержке — отпа­ла необходимость их изменять, следуя в ногу за всеми изменениями технологии более низкого, аппаратного уровня.

С точки зрения технического определения, файлы — это последовательности бай­тов. Но любые файлы можно рассмотреть под другим углом, как текстовые или бинар­ные.

Текстовые файлы состоят из битов и байтов, которые, если их правильно интер­претировать, есть ни что иное, как последовательность символов. (Некоторые файлы, например, используют кодировку Unicode.) Они предназначены для прочтения пользо­вателем, как, например, файлы, создаваемые, сохраняемые и открываемые в Notepad.

Бинарные файлы создаются и обрабатываются только компьютерными программами.

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

Бинарные файлы можно прочесть или написать более эффективно — программные данные в таком файле сохраняются в том самом виде, в котором они представлены в памяти компьютера. Отпадает необходимость в преобразованиях, отнимающих процес­сорное время. Символьные потоки менее эффективны. Так, например, все числовые данные для сохранения в текстовом файле требуют предварительного преобразования.

Вопрос 21 Класс fileinfo. Обзор элементов класса.

При создании нового объекта FileInfo, необходимо связать его с основным файлом — передать конструктору строку с именем последнего. Это имя может относиться не толь­ко к уже существующему, но и к создаваемому файлу. О процессе создания файлов с помощью FileInfo мы расскажем далее.

Предположим, что файл C:\MyTestFile\myFile.txt уже существует. Следующий оператор создает объект FileInfo по имени myFileObj, который представляет собой файл myFile.txt, расположенный в каталоге C:\MyTestFile:

FileInfo myFileObj = new FileInfo(@"C:\MyTestFile\myFile.txt");

Рассмотрим некоторые члены класса FileInfo:

СоруТо копирует файл, представленный объектом Fllelnfo, в новый файл.

Delete удаляет файл, представленный объектом Fllelnfo

FullName возвращает полное (включая путь) имя файла, представленного объектом Filelnfo

Length возвращает размер (в байтах) файла, представленного объектом Filelnfo

Name возвращает краткое (без указания пути) имя файла, представленного объектом FileInfo.

Пример. Написать программу, которая при помощи описанных выше методов выводит информацию о файле и копирует один файл в другой.

using System;

using System.Collections.Generic;

using System.Text;

using System.IO;

namespace Файлы

{

class Program

{

static void Main(string[] args)

{

try

{

FileInfo myFileObj = new FileInfo(@"D:\MyTestFile\myFile.txt");

Console.WriteLine("Имя файла " + myFileObj.Name);

Console.WriteLine("Полное имя файла " + myFileObj.FullName);

Console.WriteLine("Размер файла " + myFileObj.Length);

Console.WriteLine("Дата создания файла " + myFileObj.CreationTime);

myFileObj.CopyTo(@"D:\myTestFile\myYourFile.txt", true);

}

catch (IOException exObj)

{

Console.WriteLine(exObj);

}

Console.ReadLine();

}

}

}

Строка using System.IO; добавлена, чтобы не указывать пространство имен System.IO перед Filelnfo.

Стоит отметить, что рабочий файл часто остается надолго открытым. За этот промежуток времени дру­гие программы могут получить к нему доступ и его изменить. Как результат, файл мо­жет быть случайно удален, переименован, его содержимое изменено. При попытке об­ращения к несуществующему файлу, возникнет исключение. Поэтому весьма важно умело использовать механизм обработки исключений С#.

System.IO содержит еще один класс — File, имеющий функциональность, сходную с фун­кциональностью класса FileInfo. В отличие от FileInfo, элементы класса File объявлены как static. При использовании класса File создавать новый объект (как при FileInfo) не требуется. Например, чтобы скопировать файл C:\MyTestFiles\MyFile.txt в C:\MyTestFiles\YourFile.txt, можно воспользоваться методом Сору класса File без предварительного создания объекте:

File.Copy(@"C:\MyTestFile\myFile.txt",@"C:\myTestFile\myYourFile_.txt" );

Зачем же тогда применять FileInfo? Вызов каж­дого метода класса File требует дополнительных ресурсов процессора, так как проверке безопасного доступа к файлу производится многократно (даже если к одному и тому же файлу обращаются с помощью разных методов). Класс FileInfo производит только одну проверку — при создании объекта FileInfo. После ее завершения вся остальная обработ­ка происходит без проверок безопасности.