Введение

Статья объяснит Вам, как выполнять задачи по считыванию и введению файловой информации из разных областей, используя С#. .NET программирование API. Оно включает анализ структуры каталогов, определяет существующие папки и файлы, а также выполняет операции, связанные с файлами: перемещение, копирование и удаление объектов с диска. Цель статьи – определить типы, которые содержатся в области имен System.IO и объяснить, как разными способами можно считывать и вводить информацию в символьно-ориентированый, бинарный и строчный архив данных.

 

Обработка файлов в C# .NET


 

Структура файловой системы

Область имен System.IO состоит из 4 классов, которые помогут Вам оперировать конкретными файлами, работать с машинной структурой каталогов. Каталог адресов и файлов непосредственно наследует System.Object и поэтому выполняет задачи создания, копирования, перемещения и удаления файлов, используя при этом разные статические способы. Они содержат только статические методы, а главное то, что на их основе никогда не создаются экземпляры. Типы FileInfo и DirectotryInfo возникли от базового класса типа FileSystemInfo и обычно их используют, чтобы получить детальную информацию про файл или каталог, поскольку их элементы обычно настроены на возвращение типизованых объектов. Они используют те же общедоступные методы, что и каталог адресов и файлов, но могут сохранять данные, а элементы этих классов не статичные.

 

Структура файловой системы

 

В шаблоне .NET область имен System.IO выполняет роль библиотеки базовых классов, которая предназначена для производственных и исходящих услуг на базе файлов. Как и любая область имен, System.IO содержит большое количество классов, интерфейсов, нумераций, структур данных и их передачи. В таблице ниже представлены основные классовые типы данных:

 

Классовые типы Характеристика
Хранилище/содержание каталогов Классовые типы данных помогают управлять системой структуры каталогов.
Информация про накопитель Этот класс данных предоставляет детальную информацию про накопители, которые содержатся в компьютере. 
Файловий поток Класс данных предоставляет Вам файл прямого доступа с информацией в виде потока байтов.
Файл/сведения про файл Классовые типы данных руководят файлами, которые содержатся в компьютере. 
Путь Этот класс выполняет операции в System.String, в котором содержится информация про файл и каталог независимо от платформы.
Устройство двойного считывания/устройство двойного введения информации Классовые типы позволяют Вам сохранять и находить простые типы данных в виде двойных значений.
Поток считывания/поток введения

Этот класс используется для сохранения текстовой информации в файле.

Строчная последовательность считывания/строчная последовательность введения информации Эти классовые типы данных также работают с текстовой информацией. Однако, базовая система хранилища – скорее, строчный буфер, чем физический файл.
Поток буферизации В этом типе можно лишь временно хранить поток байтов. Вы можете разместить данные в хранилище позже.

 

В System.IO содержится класс DriveInfo, чтобы руководить системой диска во время произведения разных операций. Класс DriveInfo предоставляет детальную и полную информацию про количество дисков, общее пространство на жёстком диске, свободное пространство, название диска, состояние готовности и другое. Обратите внимание на следующую программу, которая показывает основные дисководы:

 

DriveInfo[] di = DriveInfo.GetDrives();

Console.WriteLine("Total Partitions");

foreach(DriveInfo items in di)

{

       Console.WriteLine(items.Name);

}

 

Следующие фрагменты кода отдельно выполняют все другие операции класса DriveInfo.

 

using System;

using System.IO;

namespace DiskPartition

{

       class Program

       {

             static void Main(string[] args)

             {

                    DriveInfo[] di = DriveInfo.GetDrives();

                    Console.WriteLine("Total Partitions");

                    Console.WriteLine("---------------------");

                    foreach(DriveInfo items in di)

                    {

                           Console.WriteLine(items.Name);

                    }

                    Console.Write("\nEnter the Partition::");

                    string ch = Console.ReadLine();

                    DriveInfo dInfo = new DriveInfo(ch);

                    Console.WriteLine("\n");

                    Console.WriteLine("Drive Name::{0}", dInfo.Name);

                    Console.WriteLine("Total Space::{0}", dInfo.TotalSize);

                    Console.WriteLine("Free Space::{0}", dInfo.TotalFreeSpace);

                    Console.WriteLine("Drive Format::{0}", dInfo.DriveFormat);

                    Console.WriteLine("Volume Label::{0}", dInfo.VolumeLabel);

                    Console.WriteLine("Drive Type::{0}", dInfo.DriveType);

                    Console.WriteLine("Root dir::{0}", dInfo.RootDirectory);

                    Console.WriteLine("Ready::{0}", dInfo.IsReady);

                    Console.ReadKey();

             }

       }

}

 

После разработки этой программы, она отображает каждую деталь дисковода и конкретные дисководы, как показано ниже:

 

Запуск программы

 

Работа с каталогами

Чтобы производить операции с каталогами, то есть создавать и удалять данные, шаблон .NET содержит два элементарных класса: DirectoryInfo и Directory.

Классовый тип DirectoryInfо

Класс DirectoryInfo содержит серию методов создания, удаления, перемещения и перечень каталогов и подкаталогов. В следующем кодовом примере отображена информация относительно временного каталога.

 

DirectoryInfo di = new DirectoryInfo(@"D:\temp");

Console.WriteLine("*******Direcotry Informations*******\n\n");

Console.WriteLine("Full Name={0}", di.FullName);

Console.WriteLine("Root={0}", di.Root);

Console.WriteLine("Attributes={0}", di.Attributes);

Console.WriteLine("Creation Time={0}", di.CreationTime);

Console.WriteLine("Name={0}", di.Name);

Console.WriteLine("Parent={0}", di.Parent);

 

Кодовый пример производит информацию относительно временного каталога, который содержится на диске D:

 

Информация которая содержится на диске

 

Допускается, что путь, пройденный конструктором времени класса DirectoryInfo существует. Но если Вы попробуете работать с несуществующим каталогом, то общая среда выполнения языков CLR исключит это действие. Чтобы создать каталог, сначала проверьте, нет ли таких исключений.

 

DirectoryInfo di = new DirectoryInfo(@"D:\temp\xyz");

di.Create();

 

При помощи программ и при использовании метода CreateSubdirectory можно также увеличить структуру каталога. В следующем кодовом примере показано, как создается каталог на диске D, а потом в D:\ajay\:

 

DirectoryInfo di = new DirectoryInfo(@"D:\"); 

       di.CreateSubdirectory("ajay");

di.CreateSubdirectory(@"ajay\ajay11");

 

Класс каталога

Класс каталога выполняет почти те же функции, что и класс DirectoryInfo. Класс каталога, как правило, возвращает строчные данные, а не типизированые объекты класса DirectoryInfo. В следующем примере показано, как удалять каталог и подкаталог на диске D.

 

static void Main(string[] args)

{

       DirectoryInfo di = new DirectoryInfo(@"d:\abc");

       Console.WriteLine("Name:{0}", di.FullName);

       Console.Write("Are you sure to Delete:");

       string str = Console.ReadLine();

       if (str == "y")

       {

             Directory.Delete(@"d:\abc"true);

       }

       Console.Write("Deleted.....");

}

 

Считывание и введение информации в файл

Операции считывания и введения информации происходят при использовании файлового объекта. Следующий фрагмент кода считывает текстовый файл, размещенный в компьютере.

 

private void button1_Click(object sender, EventArgs e)

{

       try

       {

             textBox2.Text = File.ReadAllText(txtPath.Text);

       }

       catch (FileNotFoundException)

       {

             MessageBox.Show("File not Found....");

       }

}

 

Сначала пользователя спрашивают, правда ли он желает действовать в выбранном им направлении. Позже, когда настанет очередь файла, метод ReadAllText считывает всю текстовую информацию с файла и отображает ее за текстовым полем.

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

 

File.WriteAllText(@"d:\test.txt", textBox2.Text);

 

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

На следующих изображениях показан процесс считывания текстового файла после того, как был выбран соответствующий шаг:

 

Процесс считывания текстового файла

 

Поток

Благодаря .NET такие классы, как FileStream, StreamReader/Writer, BinaryReader/Writer могут считывать данные и вводить их в файл. В основном, такой поток информации демонстрирует фрагмент данных, который переходит от начального места до указаного. Таким образом, он способствует взаимодействию последовательности байтов, несмотря на вид устройства, на котором хранятся байты.

 

Методы Характеристика
Считывание/считывание байтов Считывает информацию про количество байтов с исходящей точки.
Введение/введение байтов Вводит информацию про количество байтов в исходящую точку.
Поиск Определяет позицию в исходящей точке.
Расположение Определяет текущую позицию в текущем потоке информации.
Размер Меняет размер потока информации на байты.
Заполнитель Обновляет основное хранилище данных вместе с текущим буфером, а потом устанавливает новый.
Выход Закрывает текущий поток информации и предоставляет информацию, связанную с этим потоком.

 

Файловый поток

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

 

Перечисления Значения
Режим доступа к файлу Создает, добавляет, открывает, приостанавливает -  OpenOrCreate
Доступ к файлу Считывает, вводит - ReadWrite
Общий каталог Передает, считывает, вводит - ReadWrite

 

Класс файлового потока может считывать или вводить только один байт или же массив байта. Вам нужно будет раскодировать классовый тип System.String соответствующим массивом байта. Область System.Text определяет закодированый тип, чтобы потом выбрать метод закодирования или раскодирования текстового фрагмента в массив байта. Но закодированый массив байта сохраняется в файле способом FileStream.Write. Чтобы возвратить байт назад на накопитель, нужно вернуться на начальное место и использовать метод ReadByte. Затем Вам следует отобразить строчный массив байта и закодированый текстовый фрагмент на компьютере.

 

using(FileStream fs = new FileStream(@"d:\ajay123.doc", FileMode.Create))

{

       string msg = "first program";

       byte[] byteArray = Encoding.Default.GetBytes(msg);

       fs.Write(byteArray, 0, byteArray.Length);

       fs.Position = 0;

       byte[] rFile = new byte[byteArray.Length];

       for (int i = 0; i < byteArray.Length; i++)

       {

             rFile[i] = (byte)fs.ReadByte();

             Console.WriteLine(rFile[i]);

       }

       Console.WriteLine(Encoding.Default.GetString(rFile));

}

 

Двойное считывание и двойное введение информации

Классовый тип BinaryReader и Writer позволит Вам считывать и вводить дискретную информацию в указанный поток в компактном двойном формате. Классовый тип BinaryWriter определяет нужный способ введения информации, чтобы разместить ее в указанный поток.

 

Элементы Характеристика Классовый тип
Ввод Считывает элемент к текущему потоку Двойное введение
Поисковик Определяет позицию в текущем потоке Двойное введение
Закрытие Не допускает двойное считывание Двойное введение
Заполнитель Заполняет двойной поток Двойное введение
Символьный считыватель Возвращает доступные элементы, не направляет их в поток Двойное считывание
Считыватель Считывает указаный ряд байтов или других элементов и сохраняет их во входящем массиве данных Двойное считывание

 

В следующих примерах показано, как вводится определенная информация к новому файлу champu.dat, используя BinaryWriter. Далее информация считывается в то время, как классовый тип BinaryReader применяет целый ряд способов.

 

class Program

{

       static void Main(string[] args)

       {

             // writing  

             FileInfo fi = new FileInfo("champu.dat");

             using (BinaryWriter bw = new BinaryWriter(fi.OpenWrite()))

             {

                    int x = 007;

                    string str = "hello champu ,one day you will become doomkatu";

                    bw.Write(x);

                    bw.Write(str);

             }

             //Reading 

             FileInfo f = new FileInfo("champu.dat");

             using (BinaryReader br = new BinaryReader(fi.OpenRead()))

             {

                    Console.WriteLine(br.ReadInt32());

                    Console.WriteLine(br.ReadString());

             }

             Console.ReadLine();

       }

}

 

Строчное считывание и введение данных

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

 

static void Main(string[] args)

{

       // writing  

       using (StringWriter sw = new StringWriter())

       {

             sw.WriteLine("helloooooooooooooooooooo");

             // Reading 

             using (StringReader sr = new StringReader(sw.ToString()))

             {

                    string input = null;

                    while ((input = sr.ReadLine()) != null)

                    {

                           Console.WriteLine(input);

                    }

             }

       }

}

 

Вывод

Данная статья начинается со вступительной части про файловую систему .NET и содержит детальное описание ее иерархических классов. Благодаря статье Вы выучили, как управлять физическим файлом и каталогом на жестком диске, используя классовые типы File и Directory. Было детально рассмотрено классовый тип Stream. Область System.IO содержит ряд устройств введения и считывания информации, как, например, FilStream, BinaryStream, StringStream и другие. Статья рассказывает про доступ к информации и ее ввод.