Литмир - Электронная Библиотека
A
A

{

<b>  // Использовать объект FileStream...</b>

}

File.Delete(fileName);

<b>// Создать новый файл через File.Open().</b>

using(FileStream fs9 =  File.Open(fileName,

  FileMode.OpenOrCreate, FileAccess.ReadWrite,

  FileShare.None))

{

<b>  // Использовать объект FileStream...</b>

}

<b>// Получить объект FileStream с правами только для чтения.</b>

using(FileStream readOnlyStream = File.OpenRead(fileName))

{}

File.Delete(fileName);

<b>// Получить объект FileStream с правами только для записи.</b>

using(FileStream writeOnlyStream = File.OpenWrite(fileName))

{}

<b>// Получить объект StreamReader.</b>

using(StreamReader sreader = File.OpenText(fileName))

{}

File.Delete(fileName);

<b>// Получить несколько объектов StreamWriter.</b>

using(StreamWriter swriter = File.CreateText(fileName))

{}

File.Delete(fileName);

using(StreamWriter swriterAppend =

  File.AppendText(fileName))

{}

File.Delete(fileName);

Дополнительные члены типа File

Тип

File
также поддерживает несколько членов, описанных в табл. 20.6, которые могут значительно упростить процессы чтения и записи текстовых данных.

Язык программирования C#9 и платформа .NET5 - _132.png

Приведенные в табл. 20.6 методы типа

File
можно использовать для реализации чтения и записи пакетов данных посредством всего нескольких строк кода. Еще лучше то, что эти методы автоматически закрывают лежащий в основе файловый дескриптор. Например, следующий проект консольного приложения (по имени
SimpleFileIO
) сохраняет строковые данные в новом файле на диске С: (и читает их в память) с минимальными усилиями (здесь предполагается, что было импортировано пространство имен
System.IO
):

Console.WriteLine(&quot;***** Simple I/O with the File Type *****\n&quot;);

string[] myTasks = {

  &quot;Fix bathroom sink&quot;, &quot;Call Dave&quot;,

  &quot;Call Mom and Dad&quot;, &quot;Play Xbox One&quot;};

<b>// Записать все данные в файл на диске С:.</b>

File.WriteAllLines(@&quot;tasks.txt&quot;, myTasks);

<b>// Прочитать все данные и вывести на консоль.</b>

foreach (string task in File.ReadAllLines(@&quot;tasks.txt&quot;))

{

  Console.WriteLine(&quot;TODO: {0}&quot;, task);

}

Console.ReadLine();

File.Delete(&quot;tasks.txt&quot;);

Из продемонстрированного примера можно сделать вывод: когда необходимо быстро получить файловый дескриптор, тип

File
позволит сэкономить на объеме кодирования. Тем не менее, преимущество предварительного создания объекта
FileInfo
заключается в возможности сбора сведений о файле с применением членов абстрактного базового класса
FileSystemInfo
.

Абстрактный класс Stream

Вы уже видели много способов получения объектов

FileStream
,
StreamReader
и
StreamWriter
, но с использованием упомянутых типов нужно еще читать данные или записывать их в файл. Чтобы понять, как это делается, необходимо освоить концепцию потока. В мире манипуляций вводом-выводом поток (stream) представляет порцию данных, протекающую между источником и приемником. Потоки предоставляют общий способ взаимодействия с последовательностью байтов независимо от того, устройство какого рода (файл, сетевое подключение либо принтер) хранит или отображает байты.

Абстрактный класс

System.IO.Stream
определяет набор членов, которые обеспечивают поддержку синхронного и асинхронного взаимодействия с хранилищем (например, файлом или областью памяти).

На заметку! Концепция потока не ограничена файловым вводом-выводом. Естественно, библиотеки .NET Core предлагают потоковый доступ к сетям, областям памяти и прочим абстракциям, связанным с потоками.

Потомки класса

Stream
представляют данные в виде низкоуровневых потоков байтов; следовательно, работа непосредственно с низкоуровневыми потоками может оказаться не особенно понятной. Некоторые типы, производные от
Stream
, поддерживают позиционирование, которое означает процесс получения и корректировки текущей позиции в потоке. В табл. 20.7 приведено описание основных членов класса
Stream
, что помогает понять его функциональность.

Язык программирования C#9 и платформа .NET5 - _133.png

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

Класс

FileStream
предоставляет реализацию абстрактных членов
Stream
в манере, подходящей для потоковой работы с файлами. Это элементарный поток; он может записывать или читать только одиночный байт или массив байтов. Однако напрямую взаимодействовать с членами типа
FileStream
вам придется нечасто. Взамен вы, скорее всего, будете применять разнообразные оболочки потоков, которые облегчают работу с текстовыми данными или типами .NET Core. Тем не менее, полезно поэкспериментировать с возможностями синхронного чтения/записи типа
FileStream
.

366
{"b":"847442","o":1}