Рейтинговые книги
Читем онлайн Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 234 235 236 237 238 239 240 241 242 ... 407
построение динамических сборок не является распространенной задачей при разработке большинства приложений .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 перечислены некоторые основные свойства, представляющие интерес.

В классе FileSystemInfо также определен метод Delete(). Он реализуется производными типами для удаления заданного файла или каталога с жесткого диска. Кроме того, перед получением информации об атрибутах можно вызвать метод Refresh(), чтобы обеспечить актуальность статистических данных о текущем файле или каталоге.

Работа с типом DirectoryInfо

Первый неабстрактный тип, связанный с вводом-выводом, который мы исследуем здесь — DirectoryInfo. Этот класс содержит набор членов, используемых для создания, перемещения, удаления и перечисления каталогов и подкаталогов. В дополнение к функциональности, предоставленной его базовым классом (FileSystemInfо), класс DirectoryInfo предлагает ключевые члены, описанные в табл. 20.3.

Работа с типом DirectoryInfo начинается с указания отдельного пути в параметре конструктора. Если требуется получить доступ к текущему рабочему каталогу (каталогу выполняющегося приложения), то следует применять обозначение в виде точки (.). Вот некоторые примеры:

// Привязаться к текущему рабочему каталогу.

DirectoryInfo dir1 = new DirectoryInfo(".");

// Привязаться к C:Windows, используя дословную строку.

DirectoryInfo dir2 = new DirectoryInfo(@"C:Windows");

Во втором примере предполагается, что путь, передаваемый конструктору (С:Windows), уже существует на физической машине. Однако при попытке взаимодействия с несуществующим каталогом генерируется исключение System.IO.DirectoryNotFoundException. Таким образом, чтобы указать каталог, который пока еще не создан, перед работой с ним понадобится вызвать метод Create():

// Привязаться к несуществующему каталогу, затем создать его.

DirectoryInfo dir3 = new DirectoryInfo(@"C:MyCodeTesting");

dir3.Create();

Синтаксис пути, используемый в предыдущем примере, ориентирован на Windows. Если вы разрабатываете приложения .NET Core для разных платформ, тогда должны применять конструкции Path.VolumeSeparatorChar и Path.DirectorySeparatorChar, которые будут выдавать подходящие символы на основе платформы. Модифицируйте предыдущий код, как показано ниже:

DirectoryInfo dir3 = new DirectoryInfo(

  $@"C{Path.VolumeSeparatorChar}{Path.DirectorySeparatorChar}

  MyCode{Path.DirectorySeparatorChar}Testing");

После создания объекта DirectoryInfo можно исследовать содержимое лежащего в основе каталога с помощью любого свойства, унаследованного от FileSystemInfo. В целях иллюстрации создайте новый проект консольного приложения по имени DirectorуАрр и импортируйте в файл кода C# пространства имен System и System.IO. Измените класс Program, добавив представленный

1 ... 234 235 236 237 238 239 240 241 242 ... 407
На этой странице вы можете бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен бесплатно.

Оставить комментарий