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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 237 238 239 240 241 242 243 244 245 ... 407
// Использовать объект FileStream...

}

f4.Delete();

Метод FileInfо.OpenText()

Еще одним членом типа FileInfo, связанным с открытием файлов, является OpenText(). В отличие от Create(), Open(), OpenRead() и OpenWrite() метод OpenText() возвращает экземпляр типа StreamReader, а не FileStream. Исходя из того, что на диске С: имеется файл по имени boot.ini, вот как получить доступ к его содержимому:

var fileName = $@"C{Path.VolumeSeparatorChar}

                   {Path.DirectorySeparatorChar}Test.dat";

...

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

// Если вы работаете не на машине с Windows,

// тогда измените имя файла надлежащим образом.

FileInfo f5 = new FileInfo(fileName);

// Перед использованием OpenText() файл должен существовать.

f5.Create().Close();

using(StreamReader sreader = f5.OpenText())

{

  // Использовать объект StreamReader...

}

f5.Delete();

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

Методы FileInfo.CreateText() и FileInfo.AppendText()

Последними двумя методами, представляющими интерес в данный момент, являются CreateText() и AppendText(). Оба они возвращают объект StreamWriter:

var fileName = $@"C{Path.VolumeSeparatorChar}

     {Path.DirectorySeparatorChar}Test.dat";

...

FileInfo f6 = new FileInfo(fileName);

using(StreamWriter swriter = f6.CreateText())

{

  // Использовать объект StreamWriter...

}

f6.Delete();

FileInfo f7 = new FileInfo(fileName);

using(StreamWriter swriterAppend = f7.AppendText())

{

  // Использовать объект StreamWriter...

}

f7.Delete();

Как и можно было ожидать, тип StreamWriter предлагает способ записи данных в связанный с ним файл.

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

В типе File определено несколько статических методов для предоставления функциональности, почти идентичной той, которая доступна в типе FileInfo. Подобно FileInfо тип File поддерживает методы AppendText(), Create(), CreateText(), Open(), OpenRead(), OpenWrite() и OpenText(). Во многих случаях типы File и FileInfo могут применяться взаимозаменяемо. Обратите внимание, что методы OpenText() и OpenRead() требуют существования файла. Чтобы взглянуть на тип File в действии, упростите приведенные ранее примеры использования типа FileStream, применив в каждом из них тип File:

var fileName = $@"C{Path.VolumeSeparatorChar}

                   {Path.DirectorySeparatorChar}Test.dat";

...

// Использование File вместо FileInfo.

using (FileStream fs8 = File.Create(fileName))

{

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

}

File.Delete(fileName);

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

using(FileStream fs9 =  File.Open(fileName,

  FileMode.OpenOrCreate, FileAccess.ReadWrite,

  FileShare.None))

{

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

}

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

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

{}

File.Delete(fileName);

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

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

{}

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

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

{}

File.Delete(fileName);

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

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

{}

File.Delete(fileName);

using(StreamWriter swriterAppend =

  File.AppendText(fileName))

{}

File.Delete(fileName);

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

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

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

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

string[] myTasks = {

  "Fix bathroom sink", "Call Dave",

  "Call Mom and Dad", "Play Xbox One"};

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

File.WriteAllLines(@"tasks.txt", myTasks);

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

foreach (string task in File.ReadAllLines(@"tasks.txt"))

{

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

}

Console.ReadLine();

File.Delete("tasks.txt");

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

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

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

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

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

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

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

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

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

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