МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Тема 5. Приемы работы с различными источниками данных Цель Научиться обеспечивать возможность сохранять результаты трудов пользователей в перерывах между сеансами работы с приложением, то есть реализовать ввод/вывод информации в приложение. Задачи 1. Познакомиться с пространством имен System.IO, которое содержит набор типов, предназначенных для выполнения операций с файлами и другими операциями ввода и вывода. 2. Познакомиться с основами защиты информации. Оглавление Записи, файлы, каталоги Типы Directiry(Info) и File(Info) Работа с типом DirectoryInfo Статические члены класса Directory Класс FileInfo Абстрактный класс Stream. Работа с объектом FileStream Классы StreamWriter и StreamReader Основы и методы защиты информации Выводы Вопросы для самопроверки Литература Записи, файлы, каталоги Пространство имен System.IO содержит в себе большой набор типов, которые предназначены для выполнения операций с файлами и каталогами. Все типы System.IO – классы, перечисления, структуры и делегаты находятся в библиотеке mscorlib.dll. Часть типов System.IO представлена на диаграмме. Как вы видите, большинство классов System.IO предназначено для работы с каталогами и файлами на диске. Однако есть и такие типы, которые позволяют работать с МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE буферами в оперативной памяти или с областями оперативной памяти напрямую. Наиболее важные неабстрактные классы System.IO представлены в таблице 1. Таблица 1. Наиболее важные классы пространства имен System.IO Класс BinaryReader BinaryWriter Описание Позволяют сохранять и извлекать информацию типов данных-примитивов (целочисленных, логических, строковых и других подобных) как двоичные данные BufferedStream Обеспечивает временное хранилище для потока байтов (например, для последующего переноса в постоянное хранилище) Directory Используются для работы со свойствами DirectoryInfo указанного каталога или физического файла, а File также для создания новых файлов и расширения FileInfo существующей структуры каталогов. Возможности классов File и Directory реализованы главным образом в виде статистических методов. Классы DirectoryInfo и FileInfo работают через обычные объекты данных классов. FileStream Обеспечивает произвольный доступ к файлу, представляемому как поток байтов. MemoryStream Также обеспечивает произвольный доступ к потоку байтов, но уже не в виде физического файла, а в оперативной памяти. StreamWriter Используются для считывания из файла или записи StreamReader в файл текстовой информации. Произвольный доступ к файлам при помощи этого класса не поддерживается. StringWriter Эти классы также предназначены для работы с StringReader текстовой информацией, однако они применяются для работы с буфером в оперативной памяти, а не с файлом на диске. Помимо обычных классов, представленных в табл. 1, в пространстве имен System.IO предусмотрено также большое количество перечислений и абстрактных классов. Абстрактные классы (Stream, TextReader, TextWriter и подобные им) определяют общие полиморфические интерфейсы для производных классов. Для самих абстрактных классов нельзя создавать объекты, то есть нельзя работать непосредственно с этими классами. Абстрактные классы описываю общие свойства и методы (описывают интерфейс) для МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE классов – наследников. Это обычный ориентированного программирования. стиль объектно- Типы Directiry(Info) и File(Info) В пространстве имен System.IO предусмотрено четыре класса, которые предназначены для работы Object с физическими файлами на диске и структурой каталогов на диске. Первые два типа – Directory и File – позволяют выполнять операции в файловой Directory системе (создание, удаление и так далее) при помощи статистических членов. DirectoryInfo и FileInfo обладают схожими функциональными File возможностями, но они реализуются путем создания объектов данных типов. Иерархия этих классов представлена на схеме. Обратите Name внимание, что типы Directory и File напрямую Title производятся от System.Object, а DirectoryInfo и FileInfo происходят от абстрактного класса DirectoryInfo FileSystemInfo. Классы DirectoryInfo и FileInfo наследуют значительную часть своих возможностей от FileInfo абстрактного класса FileSystemInfo. Значительная часть членов FileSystemInfo предназначена для работы с общими характеристиками файла или каталога (метки времени, атрибутами и так далее). Наиболее интересные свойства FileSystemInfo представлены в табл.2. Таблица 2. Свойства класса FileSystemInfo Имя Attributes CreationTime Exists Extension FullName LastAccessTime Описание Позволяет получить или установить атрибуты для данного объекта файловой системы. Для этого свойства используются значения и перечисления FileAttributes. Позволяет получить или установить время создания объекта файловой системы. Возвращает True или False в зависимости от того, существует ли файл/каталог в указанном месте. Позволяет получить расширение для файла. Возвращает имя файла или каталога с указанием пути к нему в файловой системе. Позволяет получить или установить время последнего внесения изменений в объект файловой МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE системы. Name Возвращает имя указанного файла. Это свойство доступно только для чтения. Для каталогов возвращает имя последнего каталога в иерархии, если это возможно. Если нет, возвращает полностью определенное имя. В FileSystemInfo предусмотрено и несколько методов. Например, метод Delete() позволяет удалить объект файловой системы с жесткого диска, а метод Refresh() позволяет обновить информацию об объекте файловой системы, например, перед обращением к ее атрибутам. Работа с типом DirectoryInfo Первый «нормальный» класс, с которым мы познакомимся – класс DirectoryInfo. Он содержит набор членов, которые предназначены для создания, перемещения, удаления, получения информации о каталогах и подкаталогах в файловой системе. Помимо членов, унаследованных от FileSystemInfo, DirectoryInfo определяет также набор своих собственных, уникальных членов, представленных в табл.3. Таблица 3. Члены класса DirectoryInfo Член Create() CreateSubDirectory() Delete() GetDirectories() Описание Создают каталог (или подкаталог) по указанному пути в файловой системе. Удаляет каталог со всем его содержимым. Возвращает массив строковых значений, представляющих все подкаталоги. GetFiles() Позволяет получить файлы в текущем каталоге (в виде массива объектов FileInfo). MoveTo() Перемещает каталог и все его содержимое на новый адрес в файловой системе. Parent Возвращает родительский каталог в иерархии файловой системы. Работа с типом DirectoryInfo начинается с того, что мы указываем путь к данному каталогу, например C:\, как параметр для конструктора объекта DirectoryInfo. Если вы хотите обратиться к текущему каталогу, в котором в настоящее время производится выполнение приложения, используем обозначение “.”. В примере, который приведен ниже, мы создаем объект DirectoryInfo для каталога “C:\1” и выводим о нем интересующую нас информацию. МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Imports System.IO Module Module1 Sub Main() Dim dir As New DirectoryInfo("C:\1") Console.WriteLine("Name directory: " & dir.FullName) Console.WriteLine("Parent directory: " & dir.Parent.ToString) Console.WriteLine("Creation directory: " & dir.CreationTime) Console.WriteLine("Attributes directory: " & dir.Attributes.ToString) Console.ReadLine() End Sub Через DirectoryInfo можно не только получать доступ к информации о каталоге, но и работать с файлами в нашем каталоге. Рассмотрим пример получения информации обо всех файлах, находящихся в каталоге “C:\1” с помощью метода GetFiles() объекта DirectoryInfo. Этот метод возвращает массив объектов типа FileInfo. Мы пройдем по всем элементам этого массива при помощи конструкции For Each и выведем о них информацию на консоль: Imports System.IO Module Module1 Sub Main() Dim dir As New DirectoryInfo("C:\1") Dim files(), file As FileInfo files = dir.GetFiles For Each file In files Console.WriteLine("Name file: " & file.FullName) Next Console.ReadLine() End Sub Метод GetFile() имеет перегруженную версию для просмотра файлов в соответствии с указанной маской, например, files = dir.GetFiles("*.txt"). В этом случае мы прочитаем только файлы с расширением txt. Метод DirectoryInfo.CreateSubdirectory() позволяет создавать в выбранном нами каталоге, как единственный подкаталог, так и множество подкаталогов (в том числе и вложенных друг в друга). Давайте создадим в каталоге C:\1 несколько дополнительных подкаталогов: МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Imports System.IO Module Module1 Sub Main() Dim dir As New DirectoryInfo("C:\1") dir.CreateSubdirectory("11") Console.WriteLine("SubDirectory: " & dir.FullName) dir.CreateSubdirectory("11\111") Console.WriteLine("SubDirectory: " & dir.FullName) Console.WriteLine("SubDirectory: " & dir.FullName) Console.ReadLine() End Sub Статические члены класса Directory Работать с каталогами в .NET можно не только при помощи класса DirectoryInfo, с которым мы только что познакомились, но и при помощи класса Directory. Возможности этого класса, реализованные в виде статистических членов, во многом совпадают с возможностями DirectoryInfo (для использования которых необходимо создавать отдельный объект), однако в Directory предусмотрены и уникальные члены, аналогов которым в DirectoryInfo нет (например, метод GetLogicalDrivers()). Рассматривать все члены класса Directory мы не будем, а просто проиллюстрируем его использование для перечисления всех дисков для данного компьютера, а также для удаления с компьютера только что созданных каталогов C:\1 и C:\1\11\111. Imports System.IO Module Module1 Sub Main() Dim dir As New DirectoryInfo("C:\1") Dim drivers(), driver As String 'А теперь воспользуемся несколькими статическими методами класса Directory drivers = Directory.GetLogicalDrives For Each driver In drivers Console.WriteLine(driver) Next 'Удаляем созданные каталоги. МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE 'Необязательный второй параметр удалены также и все подкаталоги Directory.Delete("c:\1\11", True) Console.ReadLine() End Sub определяет, будут ли Класс FileInfo Класс FileInfo представляет файл, содержащийся на жестком диске компьютера. Он позволяет получить информацию об этом файле (например, о времени его создания, размере, атрибутах и так далее), а также производить различные операции, например, по созданию файла или его удалению. Это класс наследует множество членов от абстрактного класса FileSystemInfo и, кроме того, обладает еще и набором собственных уникальных членов, которые представлены в табл. 4. Таблица 4. Наиболее важные члены класса FileInfo Член AppendText() Описание Создает объект StreamWriter (о нем будет рассказано позже) для добавления текста к файлу. CopyTo() Копирует уже существующий файл в новый файл. Create() Создает новый файл и возвращает объект FileStream (о нем также будет рассказано позже) для взаимодействия с этим файлом. CreateText() Создает объект StreamWriter для записи текстовых данных в новый файл. Delete() Удаляет файл, которому соответствует объект FileInfo. Directory Возвращает каталог, в котором расположен файл. DirectoryName Возвращает полный путь к данному файлу в файловой системе. Length Возвращает размер файла. MoveTo() Перемещает файл в указанное пользователем место (этот метод позволяет одновременно переименовать данный файл). Name Позволяет получить имя файла. Open() Открывает файл с указанными пользователем правами доступа на чтение, запись или совместное использование с другими пользователями. OpenRead() Создает объект FileStream, доступный только для чтения. OpenText() Создает объект StreamReader (о нем будет рассказано ниже), который позволяет считывать информацию из МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE существующего текстового файла. OpenWrite() Создает объект FileStream, доступный для чтения и записи. Как мы видим, большинство методов FileInfo возвращают объекты (FileStream, StreamWriter, StreamReader), которые позволяют различным образом взаимодействовать с файлами, например, производить чтение или запись в него. Мы рассмотрим использование этих объектов далее, а сейчас на конкретных примерах покажем, как можно использовать методы класса FileInfo для открытия или создания файла. Imports System.IO Module Module1 Sub Main() 'Создаем новый файл в каталоге C:\1 Dim f As New FileInfo("C:\1\f.txt") Dim fs As FileStream = f.Create Console.WriteLine("Creation: " & f.CreationTime & f.FullName) Console.ReadLine() End Sub Метод FileInfo.Open() может быть использован как для открытия уже существующего файла, так и для создания нового с большим количеством возможностей, чем метод FileInfo.Create(). Вот пример: МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Imports System.IO Module Module1 Sub Main() 'открываем (или создаем) файл для чтения и записи, но без возможности совместного использования Dim f As New FileInfo("C:\1\f.txt") Dim fs As FileStream = f.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None) fs.Close() f.Delete() Console.ReadLine() End SubImports System.IO Module Module1 Sub Main() 'открываем (или создаем) файл для чтения и записи, но без возможности совместного использования Dim f As New FileInfo("C:\1\f.txt") Dim fs As FileStream = f.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None) fs.Close() f.Delete() Console.ReadLine() End Sub Еще один метод класса FileInfo, позволяющий открывать файл для чтения, – метод OpenText(). Его главное отличие от Open(), OpenRead() и OpenWrite() заключается в том, что этот метод возвращает вместо FileStream объект StreamReader. Imports System.IO Module Module1 Sub Main() Dim f As New FileInfo("C:\1\f.txt") Dim fs As FileStream = f.Open Text sr.Close() f.Delete() Console.ReadLine() End Sub Абстрактный класс Stream. Работа с объектом FileStream В терминах реализации ввода-вывода в программах stream(поток) – это сущность, предназначенная для работы с блоками данных. Абстрактный класс System.IO.Stream определяет значительное число членов, которые обеспечивают как синхронное, так и асинхронное взаимодействие со средой хранения данных (файлом на диске или МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE областью в оперативной памяти). Все классы, производные от Stream, предназначены для работы с блоками двоичных данных (для текстовых данных есть свои классы). Класс FileStream (производный от абстрактного класса Stream) обеспечивает реализацию абстрактных членов класса Stream для работы с файлами на диске. Также как и DirectoryInfo и FileInfo, FileStream обеспечивает возможность открытия существующих файлов и создание новых. Для записи потока байтов в файл используются методы WriteByte() и Write(), при применении которых внутренний указатель на место в файле перемещается автоматически. Для чтения байтов из файла можно воспользоваться методами Read() или ReadByte(): Imports System.IO Module Module1 Sub Main() Dim f As New FileStream("C:\1\f.dat", FileMode.OpenOrCreate, FileAccess.ReadWrite) 'Записываем байты в файл Dim i As Byte For i = 0 To 19 f.WriteByte(i) Next 'Переставляем внутренний указатель на начало f.Position = 0 'Считываем из файла в консоль For i = 0 To 19 Console.WriteLine(f.ReadByte) Next Console.ReadLine() End Sub Классы StreamWriter и StreamReader Классы StreamWriter и StreamReader пригодятся нам в тех ситуациях, когда необходимо считывать или записывать символьные данные (данные в формате string). По умолчанию оба этих типа работают с кодировкой Unicode. Если нас это по какой-то причине не устраивает, мы можем изменить используемую кодировку при помощи объекта System.Text.Encoding. Классы StreamWriter и StreamReader производятся от абстрактных классов TextWriter и TextReader соотвественно. Классы определяют МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE возможности для записи/чтения текстовых данных в поток. Проиллюстрируем работу с этими классами на примерах. Запись в текстовый файл: Module Module1 Sub Main() 'При помощи класса FileInfo создаем текстовый файл на диске Dim f As New FileInfo("C:\1\f.txt") 'получаем объект StreamWriter и с его помощью записываем в файл несколько строк Dim sw As StreamWriter = f.CreateText sw.WriteLine("Первая строка файла") sw.WriteLine("Вторая строка файла") sw.WriteLine("Третья строка файла") 'метод Close() автоматически очищает все буферы sw.Close() Console.ReadLine() End Sub Все очень просто. Отметим только, что методы Write() и WriteLine() многократно перегружены, чтобы обеспечить нам самые разные возможности добавления символьных и числовых данных. Считывание информации из текстового файла: Imports System.IO Module Module1 Sub Main() 'При помощи класса FileInfo открываем текстовый файл Dim f As New FileInfo("C:\1\f.txt") 'получаем объект StreamReader и с его помощью считываем файл Dim sr As StreamReader = f.OpenText Dim str As String = "0" Do While str <> "" str = sr.ReadLine Console.WriteLine(str) Loop 'метод Close() автоматически очищает все буферы sr.Close() МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Console.ReadLine() End Sub Основы и методы защиты информации Защитить информацию – это значит: обеспечить физическую целостность информации, не допустить подмены информации, не допустить несанкционированного доступа к информации. Процессы по нарушению надежности информации можно классифицировать на случайные и злоумышленные (преднамеренные). Система защиты информации – это совокупность организационных и технологических мер, программно-технических средств, правовых и моральноэтических норм, направленных на противодействие угрозам нарушителей с целью сведения до минимума возможного ущерба пользователей и владельцев системы. Программные средства и методы защиты активнее и шире других применяются для защиты информации, реализуя такие функции защиты, как разграничение и контроль доступа к ресурсам; регистрация и анализ протекающих процессов. Событий, пользователей; предотвращение возможных разрушительных воздействий на ресурсы; криптографическая защита информации; идентификация и аутентификация пользователей и процессов. Ключевыми понятиями в системе защиты компьютерных программ являются «идентификация» и «аутентификация». Идентификация – это присвоение какому-либо объекту или субъекту уникального имени или образа. Аутентификация – это установление подлинности, то есть проверка, является ли объект (субъект) действительно тем, за кого он себя выдает. Конечная цель процедур идентификации и аутентификации объекта (субъекта) – его доступ к информации ограниченного пользования в случае положительной проверки либо отказ в доступе в случае отрицательного исхода проверки. Выводы На этом обзор наиболее важных типов пространства имен System.IO завершен. К этому моменту вы уже умеете записывать текстовую и символьную информацию на диск и считывать ее оттуда. Теперь вам не потребуется много усилий, чтобы, например, изменить место сохранения данных на диске, вы можете использовать наиболее простой и удобный способ сделать это (имена методов изученных классов подскажут вам правильное решение). МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE 1. 2. 3. 4. 5. Вопросы для самопроверки Можно ли создать объект класса FileSystemInfo и использовать его свойства и методы (табл.2) для работы с файловой структурой? Что, кроме работы с каталогами и подкаталогами может класс DirectoryInfo? Нужно ли создавать объект класса Directory, чтобы воспользоваться его свойствами и методами? Чем отличаются методы FileInfo.OpenText(), FileInfoCreateText() и FileInfo,AppendText() от методов FileInfo.Open(), FileInfo.Create(), FileInfo.OpenReader() и FileInfo.OpenWriter()? Нужно ли создавать объект класса StreamWrite или StreamReader для того, чтобы записать (прочитать) символьные данные из файла? Литература 1. Троелсен Э. C# и платформа .NET. Библиотека программиста — СПб.: Питер, 2006 — 796 с.: ил. 2. Объектно-ориентированное программирование в Visual Basic.NET. Библиотека программиста / Д. Кларк. – СПб.: Питер, 2005. – 352 с.: ил. 3. Экономическая информатика: Учебник / под ред. В.П.Косарева. – 2-у изд., перераб. И доп. – М.: Финансы и статистика, 2005. – 592 с.: ил.