Резюме
В главе был представлен обзор синтаксиса и семантики языка CIL. В отличие от управляемых языков более высокого уровня, таких как С#, в CIL не просто определяется набор ключевых слов, а предоставляются директивы (используемые для определения конструкции сборки и ее типов), атрибуты (дополнительно уточняющие данные директивы) и коды операций (применяемые для реализации членов типов).
Вы ознакомились с несколькими инструментами, связанными с программированием на CIL, и узнали, как изменять содержимое сборки .NET Core за счет добавления новых инструкций CIL, используя возвратное проектирование. Кроме того, вы изучили способы установления текущей (и ссылаемой) сборки, пространств имен, типов и членов. Был рассмотрен простой пример построения библиотеки кода и исполняемого файла .NET Core с применением CIL и соответствующих инструментов командной строки.
Наконец, вы получили начальное представление о процессе создания динамической сборки. Используя пространство имен
System.Reflection.Emit
, сборку .NET Core можно определять в памяти во время выполнения. Вы видели, что работа с этим пространством имен требует знания семантики кода CIL. Хотя построение динамических сборок не является распространенной задачей при разработке большинства приложений .NET Core, оно может быть полезно в случае создания инструментов поддержки и различных утилит для программирования.
Часть VI
Работа с файлами, сериализация объектов и доступ к данным
Глава 20
Файловый ввод-вывод и сериализация объектов
При создании настольных приложений возможность сохранения информации между пользовательскими сеансами является привычным делом. В настоящей главе рассматривается несколько тем, касающихся ввода-вывода, с точки зрения платформы .NET Core. Первая задача связана с исследованием основных типов, определенных в пространстве имен
System.IO
, с помощью которых можно программно модифицировать структуру каталогов и файлов. Вторая задача предусматривает изучение разнообразных способов чтения и записи символьных, двоичных, строковых и находящихся в памяти структур данных.
После изучения способов манипулирования файлами и каталогами с использованием основных типов ввода-вывода вы ознакомитесь со связанной темой — сериализацией объектов. Сериализацию объектов можно применять для сохранения и извлечения состояния объекта с помощью любого типа, производного от
System.IO.Stream
.
На заметку! Чтобы можно было успешно выполнять примеры в главе, IDE-среда Visual Studio должна быть запущена с правами администратора (для этого нужно просто щелкнуть правой кнопкой мыши на значке Visual Studio и выбрать в контекстном меню пункт Запуск от имени администратора). В противном случае при доступе к файловой системе компьютера могут возникать исключения, связанные с безопасностью.
Исследование пространства имен System.IO
В рамках платформы .NET Core пространство имен
System.IO
представляет собой раздел библиотек базовых классов, выделенный службам файлового ввода и вывода, а также ввода и вывода в памяти. Подобно любому пространству имен внутри
System.IO
определен набор классов, интерфейсов, перечислений, структур и делегатов, большинство из которых находятся в сборке
mscorlib.dll
. В дополнение к типам, содержащимся внутри
mscorlib.dll
, в сборке
System.dll
определены дополнительные члены пространства имен
System.IO
.
Многие типы из пространства имен
System.IO
сосредоточены на программной манипуляции физическими каталогами и файлами. Тем не менее, дополнительные типы предоставляют поддержку чтения и записи данных в строковые буферы, а также в области памяти. В табл. 20.1 кратко описаны основные (неабстрактные) классы, которые дают понятие о функциональности, доступной в пространстве имен
System.IO
.
В дополнение к описанным конкретным классам внутри
System.IO
определено несколько перечислений, а также набор абстрактных классов (скажем,
Stream
,
TextReader
и
ТехtWriter
), которые формируют разделяемый полиморфный интерфейс для всех наследников. В главе вы узнаете о многих типах пространства имен
System.IO
.
Классы Directory(Directorylnfо) и File(FileInfo)
Пространство имен
System.IO
предлагает четыре класса, которые позволяют манипулировать индивидуальными файлами, а также взаимодействовать со структурой каталогов машины. Первые два класса,
Directory
и
File
, открывают доступ к операциям создания, удаления, копирования и перемещения через разнообразные статические члены. Тесно связанные с ними классы
FileInfo
и
DirectoryInfo
обеспечивают похожую функциональность в виде методов уровня экземпляра (следовательно, их экземпляры придется создавать с помощью ключевого слова
new
). Классы
Directory
и
File
непосредственно расширяют класс
System.Object
, в то время как
DirectoryInfo
и
FileInfo
являются производными от абстрактного класса
FileSystemInfo
.
Обычно классы
FileInfo
и
DirectoryInfo
считаются лучшим выбором для получения полных сведений о файле или каталоге (например, времени создания или возможности чтения/записи), т.к. их члены возвращают строго типизированные объекты. В отличие от них члены классов
Directory
и
File
, как правило, возвращают простые строковые значения, а не строго типизированные объекты. Тем не менее, это всего лишь рекомендация; во многих случаях одну и ту же работу можно делать с использованием
File/FileInfo
или
Directory/DirectoryInfo
.
Абстрактный базовый класс FileSystemInfo
Классы
DirectoryInfo
и
FileInfo
получают многие линии поведения от абстрактного базового класса
FileSystemInfo
. По большей части члены класса
FileSystemInfo
применяются для выяснения общих характеристик (таких как время создания, разнообразные атрибуты и т.д.) заданного файла или каталога. В табл. 20.2 перечислены некоторые основные свойства, представляющие интерес.