C streamwriter очистить файл

Обновлено: 05.07.2024

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

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

прямыми наследниками класса Object - классами BinaryReader и BinaryWriter, предназначенными для чтения и записи примитивных типов данных;

наследниками абстрактного класса TextReader - StreamWriter и StreamReader, использующимися для чтения и записи последовательности символов;

Потоки для работы с последовательностями байтов

В предыдущем параграфе при рассмотрении пространства имен IO было отмечено, что класс Stream - наследник абстрактного класса MarhalByRefObject - также абстрактный класс, обеспечивающий представление последовательности байтов. Классы наследники класса Stream, обеспечивают функции для работы с файлами (класс FileStream), памятью (класс MemoryStream) и дают возможность создать буфер в памяти для буферизованных потоковых операций чтения и записи (BufferedStream). Потоки поддерживают операции чтения, записи, а также операции позиционирования. Из наследников абстрактного класса Stream следует упомянуть о еще двух классах из другого пространства имен - классах NetworkStream (класс для посылки данных по сети) и CryptoStream (класс для криптографических преобразований), которые имеют схожие и отличные свойства и методы от методов потоков пространства имен IO, что пока также выходит за границу задач данного раздела.

Базовый класс Stream

Методы используемые для начала и завершения асинхронных операции чтения и записи:

- Метод BeginRead(byte[] buffer,int offset,int count,AsyncCallback callback,object state);

Начать асинхронную операцию чтения.

Параметры: buffer - буфер данных, offset - смещение байта в потоке, count - максимальное число байтов для чтения, callback - параметр типа AsyncCallback или проще - функция делегат, которая вызывается при завершении операций чтения записи, state - параметр типа AsyncState доступный через свойства AsyncState интерфейса IAsyncResult и возвращающий метод IAsyncResult. Тоесть это объект(класс), который может быть создан и заполнен пользователем некоторой информацией, которая в той или иной степени отражает состояние этапа вызова асинхронной операции, и может быть использована в дальнейшем или при прерывании или в функции обратного вызова, имя объекта доступно в функции callback.

Возвращаемое значение - IAsyncResult - интерфейс при помощи которого программа может получить информацию о состоянии асинхронной операции.

Метод вызывает прерывания IOException при выходе за границы файла (потока) и сбоях на дисках, ArgumentException - при недопустимых параметрах, ObjectDisposedException Methods - при вызовах методов для закрытого потока, NotSupportedException - если поток не поддерживает метод.

Подробный пример по работе с асинхронными методами будет рассмотрен после рассмотрения метода EndRead() (см. ниже).

- Метод EndRead(IAsyncResult asyncResult); завершает асинхронное чтение.

Возвращаемое значение число прочитанных байт.

Метод вызывает прерывания ArgumentNullException asyncResult - при нулевой ссылки параметра, ArgumentException - когдат объект IASYNCRESULT не был создан вызовом BeginRead и InvalidOperationException - при множественном вызове.

Пример работы с асинхронными методами

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

В функции AsynchronRead собственно и будет вызов асинхронного метода чтения из файла:

Структурра и функция обратного вызова используемые при вызове асинхронного метода:

Код примера выводит содержимое текстового файла только после окончания операции чтения. То, что это так, легко убедиться закоментировав строку situation.manualresetevent.Set(); в функции EndAsingRead - в этом случае данные не будут выведены вообще.

- Метод BeginWrete(byte[] buffer,int offset,int count,AsyncCallback callback,object state);

Начать асинхронную операцию записи.

Параметры: buffer - буфер данных, offset - смещение байта в потоке, count - максимальное число байтов для чтения, callback - параметр типа AsyncCallback или проще - функция делегат, которая вызывается при завершении операций чтения записи, state - параметр типа AsyncState доступный через свойства AsyncState интерфейса IAsyncResult и возвращающий метод IAsyncResult. Тоесть это объект(класс), который может быть создан и заполнен пользователем некоторой информацией, которая в той или иной степени отражает состояние этапа вызова асинхронной операции, и может быть использована в дальнейшем или при прерывании или в функции обратного вызова, имя объекта доступно в функции callback.

Возвращаемое значение - IAsyncResult - интерфейс при помощи которого программа может получить информацию о состоянии асинхронной операции.

Метод вызывает прерывания IOException при ошибках ввода/вывода, ArgumentException - при недопустимых параметрах когда смещение или индекс находятся в недопустимых пределах, ObjectDisposedException Methods - при вызовах методов для закрытого потока, NotSupportedException - если поток не поддерживает метод, ArgumentOutOfRangeException - смещение или индекс отрицательны, ArgumentNullException при нулевой ссылке на массив.

Как видно параметры и прерывания для BeginWrete полностью аналогичны параметрам и прерываниям метода BeginRead, как аналогичен и алгоритм использования метода в приведенном выше примере, в котором достаточно поменять BeginRead на BeginWrete и заранее заполнить источник situation.bText требуемой информацией, а в функции обратного вызова использовать метод EndWrite вместо EndRead. Всилу этого, пример для данного метода не приводится - каждый может легко использовать (приведенный выше пример).

- Метод EndWrete(IAsyncResult asyncResult); завершает асинхронную запись.

Возвращаемого значения нет.

Метод вызывает прерывания ArgumentNullException asyncResult - при нулевой ссылки параметра, ArgumentException - когдат объект IASYNCRESULT не был создан вызовом BeginRead и InvalidOperationException - при множественном вызове. О использовании метода мы уже говорили при описании метода BeginWrete.

Синхронные методы чтения записи:

- Метод ReadByte() - читает один байт из файла и продвигает указатель на один байт.

Возвращаемое значение - прочитанный байт.

Запишем в файл C:\a.txt числа 0123456789 и выполним следующий код:

Результат в TextBox

Кроме того в примере использован метод Seek устанавливающий текущую позицию в потоке на первый (отсчет от нуля) байт.

- Метод WriteByte(byte value) - записывает байт с текущей позиции в потоке и продвигает указатель на один байт.

Возвращаемого значения нет.

Метод вызывает прерывания ObjectDisposedException Methods - при вызовах методов для закрытого потока, NotSupportedException - если поток не поддерживает метод.

- Метод Read(bute[] buffer,int offset,int count) - читает блок размером count байт из потока с позиции байта offset и пишет данные в буфер buffer или массив байт.

Возвращаемое значение - общее число прочитанных байт или "0" - если достигнут конец потока. Если операция чтения успешна, текущая позиция потока продвигается на count байт.

Метод вызывает прерывания IOException при ошибках ввода/вывода, ArgumentException - при недопустимых параметрах когда смещение или индекс находятся в недопустимых пределах, ObjectDisposedException Methods - при вызовах методов для закрытого потока, NotSupportedException - если поток не поддерживает метод, ArgumentOutOfRangeException - смещение или индекс отрицательны, ArgumentNullException при нулевой ссылке на массив.

Пример использования метода:

- Метод Write(bute[] buffer,int offset,int count) - пишет блок размером count байт в поток с позиции байта offset из буфера байт buffer.

Возвращаемое значение - нет.

Метод вызывает прерывания IOException при ошибках ввода/вывода, ArgumentException - при недопустимых параметрах когда смещение или индекс находятся в недопустимых пределах, ObjectDisposedException Methods - при вызовах методов для закрытого потока, NotSupportedException - если поток не поддерживает метод, ArgumentOutOfRangeException - смещение или индекс отрицательны, ArgumentNullException при нулевой ссылке на массив байт.

Пример использования метода (изменим код примера для метода WriteByte и получим тотже результат):

- Метод Seek(long offset, SeekOrigin origin) - метод измененяет текущую позиции в потоке (использование см. выше и ниже в примерах) и возвращает новую позицию указателя в потоке в форме числа типа long.

Метод может вызвать прерывания IOException - если указатель файла перемещен в недопустимое местоположение или ArgumentException - значение SeekOrigin недопустимо для данного местоположения указателя.

Параметры: offset - cмещение от начала, конца или текущей позиции, origin - значение типа SeekOrigin, определяющее начало, конец, или текущую позицию.

Возможные прерывания как и у методов чтения записи: NotSupportedException - поток не поддерживает позиционирование, IOException - при ошибках ввода вывода, а также ArgumentException - при установке указателя вне размера потока и ObjectDisposedException - метод вызван для закрытого потока.

Метод изменения длины потока

- SetLength(long value) - метод изменяет длину текущего потока и возвращает новую позицию указателя в потоке;

Параметр value - новая длина потока.

Возможные прерывани: NotSupportedException - поток не поддерживает установку размеров, IOException - при ошибках ввода вывода, а также ArgumentOutOfRangeException - при попытке установить параметр длины меньше нуля.

Метод очистки буфера

- МетодFlush() - очищает все буфера для данного потока и заставляет записать в поток все буферизованные данные;

Метод вызывает прерывание IOException при ошибке ввода/вывода и ObjectDisposedException - при применении метода к закрытому потоку.

Метод закрытия потока

- МетодClose() - метод закрывает текущий поток и освобождает все ресурсы, связанные с текущим потоком и файлом.

Метод вызывает прерывание IOException если ошибка произошла при попытке закрыть поток.

В примерах ниже, чтобы корректно использовать методы класса StreamWriter , нужно подключить пространства имен System и System.IO .

1.1. Метод Close() . Закрытие потока вывода

Метод Close() предназначен для закрытия потока вывода и освобождения ресурсов. Объявление метода следующее

При использовании метода для кодировки Unicode может быть сгенерировано исключение следующего типа

Пример.

1.2. Метод Flush() . Очистка буферов

Метод Flush() используется для очистки всех буферов для текущего потока. Объявление метода следующее:

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

Пример.

1.3. Методы записи в файловый поток данных, которые представлены отдельными символами

Класс StreamWriter представляет целый набор перегруженных методов Write() или WriteLine() для записи текстовой информации в файловый поток разными способами.

1.3.1. Метод Write(char) . Запись одиночного символа

Данный метод позволяет записывать посимвольно в файловый поток

здесь value – записываемое значение.

При использовании метода могут быть исключения следующих типов

Пример. В примере в файл посимвольно записывается строка, введенная с клавиатуры.

1.3.2. Метод Write(char[]) . Запись массива символов

Для записи массива char[] в файл используется метод Write() с последующим объявлением

  • buffer – массив символов, содержащий данные, которые должны быть записаны. Если buffer равен null , то ничего не записывается.

При использовании метода Write() возможны исключительные ситуации следующих типов:

Пример. В примере в файл записывается массив строк типа string[] . После каждой строки записывается символ новой строки с помощью метода WriteLine() .

1.3.3. Метод Write(char[], int, int) . Запись массива символов с указанием диапазона

Данный метод используется для записи подстроки символов в поток. Объявления метода следующее:

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

Пример. В примере в файл записываются первые 5 символов массива строк типа string[] . Все остальные символы отсекаются.

1.4. Методы записи строк типа string в поток
1.4.1. Методы Write(string) и WriteLine(string) . Запись строки

Методы Write() и WriteLine() с параметром типа string предназначены для записи строки в поток. Объявления методов следующие

здесь value – строка, которая записывается в поток.

Метод WriteLine() в отличие от метода Write() дополнительно записывает символ новой строки в поток.

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

Пример. В примере в файл записывается массив строк типа string[] . Используется метод WriteLine() .

1.4.2. Методы Write(string, object) и WriteLine(string, object) . Запись в поток форматированной строки с одним аргументом

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

Пример. Записывается в файл число типа double с точностью 3 знака после запятой.

1.4.3. Методы Write(string, object, object) и WriteLine(string, object, object) . Запись форматованной строки с двумя аргументами

Пример. Записать в файл два числа: целое число и число типа float .

1.4.4. Методы Write(string, object, object, object) и WriteLine(string, object, object, object) . Запись форматованной строки с тремя аргументами

Пример. Записать в файл три числа типа int .

1.4.5. Метод Write(string, object[]) . Запись форматованной строки с любым количеством аргументов

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

Пример. Задан массив координат отрезков (x1, y1), (x2, y2). Нужно записать в файл эти координаты.

2. Свойства
2.1. Свойство AutoFlush

Значение true заставляет StreamWriter очищать свой поток.

Пример.

2.2. Свойство Encoding

Для определения системы кодировки используется свойство Encoding .

Система кодировки задается в конструкторе при создании текущего экземпляра. Если система кодировки не задана явно, то по умолчанию устанавливается значение

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

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

прямыми наследниками класса Object - классами BinaryReader и BinaryWriter, предназначенными для чтения и записи примитивных типов данных;

наследниками абстрактного класса TextReader - StreamWriter и StreamReader, использующимися для чтения и записи последовательности символов;

Потоки для работы с последовательностями байтов

В предыдущем параграфе при рассмотрении пространства имен IO было отмечено, что класс Stream - наследник абстрактного класса MarhalByRefObject - также абстрактный класс, обеспечивающий представление последовательности байтов. Классы наследники класса Stream, обеспечивают функции для работы с файлами (класс FileStream), памятью (класс MemoryStream) и дают возможность создать буфер в памяти для буферизованных потоковых операций чтения и записи (BufferedStream). Потоки поддерживают операции чтения, записи, а также операции позиционирования. Из наследников абстрактного класса Stream следует упомянуть о еще двух классах из другого пространства имен - классах NetworkStream (класс для посылки данных по сети) и CryptoStream (класс для криптографических преобразований), которые имеют схожие и отличные свойства и методы от методов потоков пространства имен IO, что пока также выходит за границу задач данного раздела.

Базовый класс Stream

Методы используемые для начала и завершения асинхронных операции чтения и записи:

- Метод BeginRead(byte[] buffer,int offset,int count,AsyncCallback callback,object state);

Начать асинхронную операцию чтения.

Параметры: buffer - буфер данных, offset - смещение байта в потоке, count - максимальное число байтов для чтения, callback - параметр типа AsyncCallback или проще - функция делегат, которая вызывается при завершении операций чтения записи, state - параметр типа AsyncState доступный через свойства AsyncState интерфейса IAsyncResult и возвращающий метод IAsyncResult. Тоесть это объект(класс), который может быть создан и заполнен пользователем некоторой информацией, которая в той или иной степени отражает состояние этапа вызова асинхронной операции, и может быть использована в дальнейшем или при прерывании или в функции обратного вызова, имя объекта доступно в функции callback.

Возвращаемое значение - IAsyncResult - интерфейс при помощи которого программа может получить информацию о состоянии асинхронной операции.

Метод вызывает прерывания IOException при выходе за границы файла (потока) и сбоях на дисках, ArgumentException - при недопустимых параметрах, ObjectDisposedException Methods - при вызовах методов для закрытого потока, NotSupportedException - если поток не поддерживает метод.

Подробный пример по работе с асинхронными методами будет рассмотрен после рассмотрения метода EndRead() (см. ниже).

- Метод EndRead(IAsyncResult asyncResult); завершает асинхронное чтение.

Возвращаемое значение число прочитанных байт.

Метод вызывает прерывания ArgumentNullException asyncResult - при нулевой ссылки параметра, ArgumentException - когдат объект IASYNCRESULT не был создан вызовом BeginRead и InvalidOperationException - при множественном вызове.

Пример работы с асинхронными методами

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

В функции AsynchronRead собственно и будет вызов асинхронного метода чтения из файла:

Структурра и функция обратного вызова используемые при вызове асинхронного метода:

Код примера выводит содержимое текстового файла только после окончания операции чтения. То, что это так, легко убедиться закоментировав строку situation.manualresetevent.Set(); в функции EndAsingRead - в этом случае данные не будут выведены вообще.

- Метод BeginWrete(byte[] buffer,int offset,int count,AsyncCallback callback,object state);

Начать асинхронную операцию записи.

Параметры: buffer - буфер данных, offset - смещение байта в потоке, count - максимальное число байтов для чтения, callback - параметр типа AsyncCallback или проще - функция делегат, которая вызывается при завершении операций чтения записи, state - параметр типа AsyncState доступный через свойства AsyncState интерфейса IAsyncResult и возвращающий метод IAsyncResult. Тоесть это объект(класс), который может быть создан и заполнен пользователем некоторой информацией, которая в той или иной степени отражает состояние этапа вызова асинхронной операции, и может быть использована в дальнейшем или при прерывании или в функции обратного вызова, имя объекта доступно в функции callback.

Возвращаемое значение - IAsyncResult - интерфейс при помощи которого программа может получить информацию о состоянии асинхронной операции.

Метод вызывает прерывания IOException при ошибках ввода/вывода, ArgumentException - при недопустимых параметрах когда смещение или индекс находятся в недопустимых пределах, ObjectDisposedException Methods - при вызовах методов для закрытого потока, NotSupportedException - если поток не поддерживает метод, ArgumentOutOfRangeException - смещение или индекс отрицательны, ArgumentNullException при нулевой ссылке на массив.

Как видно параметры и прерывания для BeginWrete полностью аналогичны параметрам и прерываниям метода BeginRead, как аналогичен и алгоритм использования метода в приведенном выше примере, в котором достаточно поменять BeginRead на BeginWrete и заранее заполнить источник situation.bText требуемой информацией, а в функции обратного вызова использовать метод EndWrite вместо EndRead. Всилу этого, пример для данного метода не приводится - каждый может легко использовать (приведенный выше пример).

- Метод EndWrete(IAsyncResult asyncResult); завершает асинхронную запись.

Возвращаемого значения нет.

Метод вызывает прерывания ArgumentNullException asyncResult - при нулевой ссылки параметра, ArgumentException - когдат объект IASYNCRESULT не был создан вызовом BeginRead и InvalidOperationException - при множественном вызове. О использовании метода мы уже говорили при описании метода BeginWrete.

Синхронные методы чтения записи:

- Метод ReadByte() - читает один байт из файла и продвигает указатель на один байт.

Возвращаемое значение - прочитанный байт.

Запишем в файл C:\a.txt числа 0123456789 и выполним следующий код:

Результат в TextBox

Кроме того в примере использован метод Seek устанавливающий текущую позицию в потоке на первый (отсчет от нуля) байт.

- Метод WriteByte(byte value) - записывает байт с текущей позиции в потоке и продвигает указатель на один байт.

Возвращаемого значения нет.

Метод вызывает прерывания ObjectDisposedException Methods - при вызовах методов для закрытого потока, NotSupportedException - если поток не поддерживает метод.

- Метод Read(bute[] buffer,int offset,int count) - читает блок размером count байт из потока с позиции байта offset и пишет данные в буфер buffer или массив байт.

Возвращаемое значение - общее число прочитанных байт или "0" - если достигнут конец потока. Если операция чтения успешна, текущая позиция потока продвигается на count байт.

Метод вызывает прерывания IOException при ошибках ввода/вывода, ArgumentException - при недопустимых параметрах когда смещение или индекс находятся в недопустимых пределах, ObjectDisposedException Methods - при вызовах методов для закрытого потока, NotSupportedException - если поток не поддерживает метод, ArgumentOutOfRangeException - смещение или индекс отрицательны, ArgumentNullException при нулевой ссылке на массив.

Пример использования метода:

- Метод Write(bute[] buffer,int offset,int count) - пишет блок размером count байт в поток с позиции байта offset из буфера байт buffer.

Возвращаемое значение - нет.

Метод вызывает прерывания IOException при ошибках ввода/вывода, ArgumentException - при недопустимых параметрах когда смещение или индекс находятся в недопустимых пределах, ObjectDisposedException Methods - при вызовах методов для закрытого потока, NotSupportedException - если поток не поддерживает метод, ArgumentOutOfRangeException - смещение или индекс отрицательны, ArgumentNullException при нулевой ссылке на массив байт.

Пример использования метода (изменим код примера для метода WriteByte и получим тотже результат):

- Метод Seek(long offset, SeekOrigin origin) - метод измененяет текущую позиции в потоке (использование см. выше и ниже в примерах) и возвращает новую позицию указателя в потоке в форме числа типа long.

Метод может вызвать прерывания IOException - если указатель файла перемещен в недопустимое местоположение или ArgumentException - значение SeekOrigin недопустимо для данного местоположения указателя.

Параметры: offset - cмещение от начала, конца или текущей позиции, origin - значение типа SeekOrigin, определяющее начало, конец, или текущую позицию.

Возможные прерывания как и у методов чтения записи: NotSupportedException - поток не поддерживает позиционирование, IOException - при ошибках ввода вывода, а также ArgumentException - при установке указателя вне размера потока и ObjectDisposedException - метод вызван для закрытого потока.

Метод изменения длины потока

- SetLength(long value) - метод изменяет длину текущего потока и возвращает новую позицию указателя в потоке;

Параметр value - новая длина потока.

Возможные прерывани: NotSupportedException - поток не поддерживает установку размеров, IOException - при ошибках ввода вывода, а также ArgumentOutOfRangeException - при попытке установить параметр длины меньше нуля.

Метод очистки буфера

- МетодFlush() - очищает все буфера для данного потока и заставляет записать в поток все буферизованные данные;

Метод вызывает прерывание IOException при ошибке ввода/вывода и ObjectDisposedException - при применении метода к закрытому потоку.

Метод закрытия потока

- МетодClose() - метод закрывает текущий поток и освобождает все ресурсы, связанные с текущим потоком и файлом.

Метод вызывает прерывание IOException если ошибка произошла при попытке закрыть поток.

Классы StreamWriter и StreamReader удобны во всех случаях, когда нужно читать или записывать символьные данные (например, строки). Оба типа работают по умолчанию с символами Unicode; однако это можно изменить предоставлением правильно сконфигурированной ссылки на объект System.Text.Encoding. Чтобы не усложнять пример, предположим, что кодировка по умолчанию Unicode вполне устраивает.

Класс StreamReader, унаследован от абстрактного класса по имени TextReader. Базовый класс предлагает очень ограниченный набор функциональности каждому из его наследников, в частности — возможность читать и "заглядывать" (peek) в символьный поток.

Класс StreamWriter наследуется от абстрактного базового класса по имени TextWriter. В этом классе определены члены, позволяющие производным типам записывать текстовые данные в заданный символьный поток.

Чтобы приблизить вас к пониманию основных возможностей записи классов StreamWriter и StringWriter, ниже представлены описания основных членов абстрактного базового класса TextWriter:

Close()

Этот метод закрывает объект-писатель и освобождает все связанные с ним ресурсы. В процессе автоматически сбрасывается буфер (опять-таки, этот член функционально эквивалентен методу Dispose())

Flush ()

Этот метод очищает все буферы текущего объекта-писателя и записывает все буферизованные данные на лежащее в основе устройство, однако, не закрывает его

NewLine

Это свойство задает константу перевода строки для унаследованного класса писателя. По умолчанию ограничителем строки в Windows является возврат каретки, за которым следует перевод строки (\r\n)

Write()

Этот перегруженный метод записывает данные в текстовый поток без добавления константы новой строки

WriteLine()

Этот перегруженный метод записывает данные в текстовый поток с добавлением константы новой строки

Последние два члена класса TextWriter, скорее всего, покажутся знакомыми. Если помните, тип System.Console имеет члены Write() и WriteLine(), которые выталкивают текстовые данные на стандартное устройство вывода. Фактически свойство Console.In хранит TextReader, a Console.Out — TextWriter.

Унаследованный класс StreamWriter предоставляет соответствующую реализацию методов Write(), Close() и Flush(), а также определяет дополнительное свойство AutoFlush. Когда это свойство установлено в true, оно заставляет StreamWriter выталкивать данные при каждой операции записи. Имейте в виду, что можно обеспечить более высокую производительность, установив AutoFlush в false, но при этом всегда вызывать Close() по завершении работы с StreamWriter.

Используя классы StreamReader и StreamWriter, не нужно беспокоиться о применяемой в файле кодировке (формате текста). К числу возможных кодировок относятся ASCII (1 байт на каждый символ) и Unicode с его разновидностями UTF7, UTF8 и UTF32. Текстовые файлы в системах Windows 9х всегда используют кодировку ASCII, потому что в них Unicode не поддерживается. Но поскольку в ОС Windows NT, 2000, XP, 2003, Vista, Windows Server 2008 и Windows 7 кодировка Unicode поддерживается, теоретически текстовые файлы могут содержать данные не ASCII, а Unicode, UTF7, UTF8 и UTF32.

По соглашению, если файл имеет формат ASCII, он будет просто содержать текст. Если же файл имеет какой-то из форматов Unicode, об этом будет обязательно сообщаться в первых двух или трех байтах файла, в которых устанавливаются определенные комбинации значений для обозначения используемого в файле формата.

Эти байты называют . При открытии файла в любом стандартном приложении Windows, таком как Notepad или WordPad, об этом беспокоиться не нужно, потому что эти приложения различают кодировку, и будут автоматически читать файл правильным образом. Точно так же обстоит дело и с классом StreamReader, который умеет правильно считывать файл в любом из этих форматов, и классом StreamWriter, умеющим форматировать записываемый файл с использованием любой запрашиваемой кодировки. Если для чтения и записи текстового файла планируется использовать класс FileStream, то об этих вещах необходимо заботиться самостоятельно.

Читайте также: