Energy
education

сайт для тех, кто хочет изучать энергетику

26. Файловый ввод / вывод

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

Поток в основном это последовательность байтов, проходящих через канал связи. Есть два основных потока: входной поток и выходной поток. Входной поток используется для считывания данных из файла (операция чтения) и выходной поток используется для записи в файл (операция записи).

Классы ввода / вывода в C#

Пространство имен System.IO имеет различные классы, которые используются для выполнения различных операций с файлами, такие как создание и удаление файлов, чтения или записи в файл, закрытие файла и т.д.

В следующей таблице приведены некоторые часто используемые классы пространства имен System.IO:

Класс ввода / выводаОписание
BinaryReaderЧитает примитивные данные из двоичного потока.
BinaryWriterЗаписывает примитивные данных в двоичном формате.
BufferedStreamВременное хранилище для потока байтов.
DirectoryПомогает управлять структурой каталогов.
DirectoryInfoИспользуется для выполнения операций над каталогами.
DriveInfoСодержит информацию о дисках.
FileПомогает в управлении файлами.
FileInfoИспользуется для выполнения операций над файлами.
FileStreamИспользуется для чтения и записи в любое место в файле.
MemoryStreamИспользуется для произвольного доступа к потоковым данным, хранящимся в памяти.
PathВыполняет операции на пути информации.
StreamReaderИспользуется для чтения символов из потока байтов.
StreamWriterИспользуется для записи символов в поток.
StringReaderИспользуется для чтения из буфера строки.
StringWriterИспользуется для записи в буфер строк.

Класс FileStream

Класс FileStream в пространстве имен System.IO помогает в чтении, записи и закрытии файлов. Этот класс является производным от абстрактного класса Stream.

Вам нужно создать объект класса FileStream чтобы создать новый файл или открыть существующий файл. Синтаксис создания объектов класса FileStream следующий:

    
FileStream <object_name> = new FileStream( <file_name>,
<FileMode Enumerator>, <FileAccess Enumerator>, <FileShare Enumerator>);
    

Пример для создания объектов класса FileStream F для чтения из файла sample.txt:

    
FileStream F = new FileStream("sample.txt", FileMode.Open, FileAccess.Read, FileShare.Read);
    
ПараметрОписание
FileMode FileMode определяет различные методы для открытия файлов. Вариантами FileMode являются:
Append: Открывает существующий файл и помещает курсор в конец файла, или создает файл, если файл не существует.
Create: Создает новый файл.
CreateNew: Передает в операционную систему, что она должна создать новый файл.
Open: Открывает существующий файл.
OpenOrCreate: Передает в операционную систему, что она должна открыть файл, если он существует, в противном случае она должна создать новый файл.
Truncate: Открывает существующий файл и обрезает его размер до нуля байт.
FileAccess Вариантами FileAccess являются: Read, ReadWrite и Write.
FileShare Вариантами FileShare являются:
Inheritable: Разрешает наследование дескриптора файла дочерними процессами.
None: Отклоняет совместное использование текущего файла.
Read: Разрешает последующее открытие файла для чтения.
ReadWrite: Разрешает последующее открытие файла для чтения или записи.
Write: Разрешает последующее открытие файла для записи.

Пример

Следующая программа демонстрирует использование класса FileStream :

    
using System;
using System.IO;
namespace FileIOApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            FileStream F = new FileStream("test.dat", 
            FileMode.OpenOrCreate, FileAccess.ReadWrite);
            for (int i = 1; i <= 20; i++)
            {
                F.WriteByte((byte)i);
            }
            F.Position = 0;
            for (int i = 0; i <= 20; i++)
            {
                Console.Write(F.ReadByte() + " ");
            }
            F.Close();
            Console.ReadKey();
        }
    }
}
    

Если приведенный выше код скомпилировать и выполнить, это приведет к следующему результату:

    
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 -1
    

Дополнительные операции с файлами в C#

В предыдущем примере предоставены простые операции с файлами в C#. Однако, чтобы использовать огромные возможности классов C# System.IO, вы должны знать, часто используемые свойства и методы этих классов.

Чтение и запись в текстовые файлы

Классы StreamReader и StreamWriter используются для чтения и записи данных в текстовые файлы. Эти классы наследуют от абстрактного базового класса Stream, который поддерживает чтение и запись байтов в файловый поток.

Класс StreamReader

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

НомерИмя и описание метода
1public override void Close()
Закрывает объект StreamReader и базовый поток, а также освобождает все системные ресурсы, связанные с устройством считывания.
2public override int Peek()
Возвращает следующий доступный символ, но не использует его.
3public override int Read()
Читает следующий символ из входного потока и перемещает позицию символа на один символ.

Пример

Следующий пример демонстрирует чтение текстового файла с именем Jamaica.txt:

    
Down the way where the nights are gay
And the sun shines daily on the mountain top
I took a trip on a sailing ship
And when I reached Jamaica
I made a stop
    
    
using System;
using System.IO;
namespace FileApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                // создает экземпляр StreamReader для чтения из файла 
                // выражение using также закрывает StreamReader 
                using (StreamReader sr = new StreamReader("c:/jamaica.txt"))
                {
                    string line;
                   
                    // чтение и отображение строк из файла, пока
                    // конца файла не будет достигнут 
                    while ((line = sr.ReadLine()) != null)
                    {
                        Console.WriteLine(line);
                    }
                }
            }
            catch (Exception e)
            {
                // дает пользователю понять, что что-то пошло не так
                Console.WriteLine("Файл не может быть прочитан:");
                Console.WriteLine(e.Message);
            }
            Console.ReadKey();
        }
    }
}
    

Класс StreamWriter

Класс StreamWriter наследует от абстрактного класса TextWriter.

В следующей таблице приведены некоторые из наиболее часто используемых методов этого класса:

НомерИмя и описание метода
1public override void Close()
Закрвает текущий объект StreamWriter и основной поток.
2public override void Flush()
Очищает все буферы для текущего писателя и вызывает запись всех данных буфера в основной поток.
3public virtual void Write(bool value)
Writes the text representation of a Boolean value to the text string or stream. (Inherited from TextWriter.)
4 public override void Write( char value )
Записывает символ в поток.
5 public virtual void Write( decimal value )
Записывает текстовое представление десятичного значения в текстовую строку или поток.
6 public virtual void Write( double value )
Записывает текстовое представление 8-байтного значения с плавающей точкой в текстовую строку или поток.
7 public virtual void Write( int value )
Записывает текстовое представление 4-разрядного целого числа в текстовую строку или поток.
8 public override void Write( string value )
Записывает строку в поток.
9public virtual void WriteLine()
Записывает конца строки текстовой строки или потока.

Пример

В следующем примере демонстрируется запись текстовых данных в файл с помощью класса StreamWriter:

    
using System;
using System.IO;
namespace FileApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] names = new string[] {"Zara Ali", "Nuha Ali"};
            using (StreamWriter sw = new StreamWriter("names.txt"))
            {
                foreach (string s in names)
                {
                    sw.WriteLine(s);
                }
            }
            // чтение и отображение строк из файла
            string line = "";
            using (StreamReader sr = new StreamReader("names.txt"))
            {
                while ((line = sr.ReadLine()) != null)
                {
                    Console.WriteLine(line);
                }
            }
            Console.ReadKey();
        }
    }
}
    

Если приведенный выше код скомпилировать и выполнить, это приведет к следующему результату:

    
Zara Ali
Nuha Ali
    

Чтение и запись в двоичные файлы

Классы BinaryReader и BinaryWriter are used for reading from and writing to a binary file.используются для чтения и записи в двоичный файл

Класс BinaryReader

Класс BinaryReader используется для чтения двоичных данных из файла. Объект BinaryReader создается путем передачи объекта FileStream его конструктору.

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

НомерИмя и описание метода
1public override void Close()
Закрывает объект BinaryReader и основной поток.
2public virtual int Read()
Читает символы из потока и перемещает текущую позицию в потоке.
3public virtual bool ReadBoolean()
Считывает логическое значение из текущего потока и перемещает текущую позицию в потоке на один байт.
4public virtual byte ReadByte()
Читает следующий байт из текущего потока и перемещает текущую позицию в потоке на один байт.
5 public virtual byte[] ReadBytes( int count )
Считывает указанное число байт из текущего потока в массив байт и перемещает текущую позицию тем, что количество байт.
6public virtual char ReadChar()
Чтение следующего символа из текущего потока и перемещает текущую позицию в потоке в соответствии с используемой кодировки и специфики читается из потока.
7 public virtual char[] ReadChars( int count )
Читает указанное количество символов из текущего потока, возвращает данные в массив символов, и перемещает текущую позицию в соответствии с используемой кодировки и специфики читается из потока.
8public virtual double ReadDouble()
Читает 8-байтовое значение с плавающей запятой из текущего потока и перемещает текущую позицию в потоке на восемь байтов.
9public virtual int ReadInt32()
Читает 4-разрядное целое число из текущего потока и перемещает текущую позицию в потоке на четыре байта.
10 public virtual string ReadString()
Считывает строку из текущего потока. Строка с префиксом длины, кодируется как целое семь бит за один раз.

Класс BinaryWriter

Класс BinaryWriter используется для записи двоичных данных в поток. Объект BinaryWriter создается путем передачи объекта FileStream его конструктору.

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

НомерИмя и описание метода
1public override void Close()
Он закрывает объект BinaryWriter и основной поток.
2public virtual void Flush()
Очищает все буферы для текущего писателя и вызывает запись всех данных буфера записываются в базовое устройство.
3 public virtual long Seek( int offset, SeekOrigin origin )
Задает позицию в текущем потоке.
4 public virtual void Write( bool value )
Записывает один байт логического значения в текущем потоке, при этом 0 соответствует ложи и 1 соответствует истине.
5 public virtual void Write( byte value )
Записывает байт без знака на текущий поток и перемещает позицию в потоке на один байт.
6 public virtual void Write( byte[] buffer )
Записывает массив байтов в основной поток.
7 public virtual void Write( char ch )
Записывает символ Юникода в текущий поток и перемещает текущую позицию в потоке в соответствии с используемой кодировки и конкретных символов, записываемых в потоке.
8 public virtual void Write( char[] chars )
Записывает массив символов в текущий поток и перемещает текущую позицию в потоке в соответствии с используемой кодировки и конкретных символов, записываемых в потоке.
9 public virtual void Write( double value )
Записывает восьмибайтовое значение с плавающей точкой в текущий поток и перемещает позицию в потоке на восемь байтов.
10 public virtual void Write( int value )
Записывает четыре-разрядного целого числа текущего потока и перемещает позицию в потоке на четыре байта.
11 public virtual void Write( string value )
Записывает с префиксом длины строки в этот поток в текущей кодировке BinaryWriter, и перемещает текущую позицию в потоке в соответствии с кодировкой, используемой и конкретных символов, записываемых в потоке.

Пример

Следующий пример демонстрирует чтения и записи двоичных данных:

    
using System;
using System.IO;
namespace BinaryFileApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            BinaryWriter bw;
            BinaryReader br;
            int i = 25;
            double d = 3.14157;
            bool b = true;
            string s = "I am happy";
            // создание файла
            try
            {
                bw = new BinaryWriter(new FileStream("mydata",
				FileMode.Create));
            }
            catch (IOException e)
            {
                Console.WriteLine(e.Message + "\n Невозможно создать файл.");
                return;
            }
            // запись в файл
            try
            {
                bw.Write(i);
                bw.Write(d);
                bw.Write(b);
                bw.Write(s);
            }
            catch (IOException e)
            {
                Console.WriteLine(e.Message + "\n Невозможно записать в файл.");
                return;
            }
            bw.Close();
            // чтение из файла
            try
            {
                br = new BinaryReader(new FileStream("mydata",
				FileMode.Open));
            }
            catch (IOException e)
            {
                Console.WriteLine(e.Message + "\n Не удается открыть файл.");
                return;
            }
            try
            {
                i = br.ReadInt32();
                Console.WriteLine("Integer data: {0}", i);
                d = br.ReadDouble();
                Console.WriteLine("Double data: {0}", d);
                b = br.ReadBoolean();
                Console.WriteLine("Boolean data: {0}", b);
                s = br.ReadString();
                Console.WriteLine("String data: {0}", s);
            }
            catch (IOException e)
            {
                Console.WriteLine(e.Message + "\n Cannot read from file.");
                return;
            }
            br.Close();
            Console.ReadKey();
        }
    }
}
    

Если приведенный выше код скомпилировать и выполнить, это приведет к следующему результату:

    
Integer data: 25
Double data: 3.14157
Boolean data: True
String data: I am happy
    

Файловая система Windows

C# позволяет работать с каталогами и файлами с помощью различных связанных классов DirectoryInfo и FileInfo.

Класс DirectoryInfo

Класс DirectoryInfo выводится из класса FileSystemInfo. Он имеет различные методы для создания, перемещения и просмотра через каталоги и подкаталоги. Этот класс не может быть унаследован.

Ниже приведены некоторые часто используемые свойства класса DirectoryInfo:

НомерИмя и описание свойства
1Attributes
Получает атрибуты для текущего файла или каталога.
2CreationTime
Получает время создания текущего файла или каталога.
3Exists
Возвращает логическое значение, указывающее, является ли каталог существует.
4Extension
Возвращает строку, представляющую расширение файла.
5FullName
Получает полный путь к каталогу или файлу.
6LastAccessTime
Возвращает время текущего файла или каталога последнего доступа.
7Name
Возвращает имя этого экземпляра DirectoryInfo.

Ниже приведены некоторые часто используемые методы класса DirectoryInfo:

НомерИмя и описание метода
1public void Create()
Создает каталог.
2 public DirectoryInfo CreateSubdirectory( string path )
Создает один или несколько подкаталогов по заданному пути.Путь может быть задан относительно этого экземпляра класса DirectoryInfo.
3public override void Delete()
Удаляет данный DirectoryInfo если он пуст.
4public DirectoryInfo[] GetDirectories()
Возвращает подкаталоги текущего каталога.
5public FileInfo[] GetFiles()
Возвращает список файлов в текущем каталоге.

Класс FileInfo

Класс FileInfo получен из класса FileSystemInfo. Он имеет свойства и методы экземпляра для создания, копирования, удаления, перемещения и открытия файлов, а также помогает в создании объектов FileStream. Этот класс не может быть унаследован.

Ниже приведены некоторые часто используемые свойства класса FileInfo:

НомерИмя и описание свойства
1Attributes
Получает атрибуты для текущего файла.
2CreationTime
Получает время создания текущего файла.
3Directory
Получает экземпляр каталога, который принадлежит файл.
4Exists
Возвращает логическое значение, указывающее, существует ли файл.
5Extension
Возвращает строку, представляющую расширение файла.
6FullName
Получает полный путь к файлу.
7LastAccessTime
Возвращает время текущего последнего доступа к файлу.
8LastWriteTime
Получает время последнего письменного активность файл.
9Length
Получает размер в байтах текущего файла.
10Name
Получает имя файла.

Ниже приведены некоторые часто используемые методы класса FileInfo:

НомерИмя и свойства метода
1public StreamWriter AppendText()
Создает StreamWriter, что добавляет текст в файл, представленный этим экземпляром FileInfo.
2public FileStream Create()
Создает файл.
3public override void Delete()
Удаляет файл постоянно.
4 public void MoveTo( string destFileName )
Перемещает указанный файл в новое место, обеспечивая возможность указать новое имя файла.
5 public FileStream Open( FileMode mode )
Открывает файл в указанном режиме.
6 public FileStream Open( FileMode mode, FileAccess access )
Открывает файл в указанном режиме с чтение, запись или чтение / запись доступ.
7 public FileStream Open( FileMode mode, FileAccess access, FileShare share )
Открывает файл в указанном режиме с чтение, запись или чтение / запись и указанным параметром совместного.
8public FileStream OpenRead()
Создает FileStream только для чтения.
9public FileStream OpenWrite()
Создает FileStream только для записи.

Пример

Следующий пример демонстрирует использование вышеуказанных классов:

    
using System;
using System.IO;
namespace WindowsFileApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            // создание объекта DirectoryInfo
            DirectoryInfo mydir = new DirectoryInfo(@"c:\Windows");
            // получение файлов в каталоге, их названия и размера
            FileInfo [] f = mydir.GetFiles();
            foreach (FileInfo file in f)
            {
                Console.WriteLine("Имя файла: {0} Размер: {1}",
				    file.Name, file.Length);
            }
            Console.ReadKey();
        }
    }
}