Язык программирования C#9 и платформа .NET5
Шрифт:
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. Тем не менее, полезно поэкспериментировать с возможностями синхронного чтения/записи типа FileStream
. Пусть имеется новый проект консольного приложения под названием
FileStreamApp
(и в файле кода C# импортировано пространство имен System.IO
и System.Text
). Целью будет запись простого текстового сообщения в новый файл по имени myMessage.dat
. Однако с учетом того, что FileStream
может оперировать только с низкоуровневыми байтами, объект типа System.String
придется закодировать в соответствующий байтовый массив. К счастью, в пространстве имен System.Text
определен тип Encoding
, предоставляющий члены, которые кодируют и декодируют строки в массивы байтов.
Поделиться с друзьями: