Тема 5. Приемы работы с различными источниками данных

advertisement
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
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
с.: ил.
Download