C# — Работа с текстовым файлом c#

Содержание

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

Операции чтения и записи данных в файлы в принципе очень просты, однако выполняются они не через объекты DirectoryInfo и FileInfo. В .NET Framework 4 это делается через объект File. Позже будет показано, как их выполнять с помощью других классов, представляющих обобщенную концепцию потока (stream).

До появления .NET Framework 2.0 вокруг того, как следует производить чтение и запись данных в файлы, велось много споров. Классы из .NET Framework можно было использовать, но такой подход не был простым. В версии .NET Framework 2.0 класс File был расширен; с его помощью стало возможным выполнение операций чтения и записи данных в файлы с помощью всего одной строки кода. То же самое доступно и в .NET Framework 4.

Чтение из файла

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

При построении данного приложения первым шагом является добавление оператора using для включения пространства имен System.IO. После этого с помощью события buttonRead_Click кнопки Прочитать многострочное текстовое поле заполняется содержимым файла. Затем к содержимому файла можно получать доступ методом File.ReadAllText(). Как не трудно заметить, чтение файла осуществляется с помощью единственного оператора.

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

Для открытия файлов и работы с ними предназначены также методы ReadAllBytes и ReadAllLines. Метод ReadAllBytes позволяет открывать двоичные файлы и считывать их содержимое в байтовый массив. Упомянутый выше метод ReadAllText возвращает все содержимое файла в виде одной строки. Такое поведение не всегда подходит. Вместо этого может требоваться работать с содержимым файла в построчной манере, т.е. строка за строкой. Для этого служит метод ReadAllLines, который возвращает массив строк с содержимым файла.

Запись в файл

Помимо чтения, в .NET Framework существенно упрощает также и запись данных в файлы. Вдобавок к методам для чтения файлов ReadAllText(), ReadAllLines() и ReadAllBytes() , в ней предлагаются методы, предназначенные для записи данных в файлы — WriteAllText() , WriteAllBytes() иWriteAllLines().

Рассмотрим пример, основанный на том же проекте WPF, но на этот раз многострочное текстовое поле будет использоваться для ввода данных в файл. Код обработчика событий buttonRead_Click теперь должен выглядеть следующим образом:

Скомпонуйте и запустите приложение. Введите в первом текстовом поле значение С:\Testing.txt, а во втором — какой-нибудь текст, после чего щелкните на кнопке. Внешне ничего не произойдет, однако, если заглянуть после этого в корневой каталог на диске С:, то можно будет обнаружить там файл Testing.txt с содержимым, которое было введено во втором текстовом поле.

Метод WriteAllText() создал в указанном каталоге новый текстовый файл, поместил в него предоставленное в поле содержимое и закрыл файл. Неплохо для всего одной строки кода. Если запустить приложение снова и указать тот же файл (Testing.txt), но задать новое содержимое для него, щелчок на кнопке опять заставит приложение выполнить ту же операцию. Новое содержимое не добавляется к старому, а полностью заменяет его. Методы WriteAllText(), WriteAllBytes() и WriteAllLines() перезаписывают предыдущее содержимое файла, поэтому при их применении следует соблюдать осторожность.

Поскольку данные могут записываться не только на диск, но и в другие места (например, в именованные каналы или в память), важно уметь работать с файловым вводом-выводом в .NET, используя потоки в качестве средства для перемещения содержимого файлов. Об этом пойдет речь в следующей статье.

Чтение текстового файла построчно на C#

Два самых простых способа как прочитать текстовый файл построчно на C#. В обоих случаях используется using System.IO;. Напишу сразу примеры кода без всяких прелюдий.

Способ 1

Классический вариант чтения файла построчно:

Еще один пример, как можно организовать цикл построчного чтения:

Указать кодировку при чтении файла (например, DOS-кодировку) можно так:

Так же можно использовать обёртку using чтобы не закрывать файл после чтения.

Способ 2

Прочитать весь файл целиком в массив строк:

Работа с файлом в Си Шарп. File C#

Си Шарп предоставляет огромные возможности для работы с файлами: чтение, запись, перезапись текста и так далее.

Для того, чтобы работать с файлами, необходимо:

  1. Поключить пространство имен:
    using System.IO;
  2. Использовать класс: File.

В классе File имеются методы, с которыми мы можем работать.

Чтение файла

Чтение файла может быть вызвано несколькими методами:

File .ReadAllLines — считывает с текстового файла все строки и закрывает файл.

File .ReadAllBytes — считывает двоичный файл и записывает результат в массив байтов и закрывает файл.

File .ReadAllText — считывает текстовый файл с заданной кодировкой.

File .ReadLines — считывает строки с заданной кодировкой.

Мы видим некоторые методы, которы выполняют одно и тоже, но выходные данные разные.

Примеры считывания с файла на C#:

byte [] f2 = File .ReadAllBytes( «youtext.txt» );

byte [] f2 = File .ReadAllBytes( «youtext.txt» ); // Метод считывания с файла

Encoding code = Encoding .ASCII;
string f3 = File.ReadAllText( «youtext.txt» , code); // Метод считывания с файла

IEnumerable string > s = File .ReadLines( «youtext.txt» , code); // Метод считывания с файла

Копирование файла

Если вам нужно скопировать текстовый файл, то для этого нужно использовать метод: Copy.

File .Copy — копирует из существующего файла в другой файл. Возможно копировать самого в себя.

File .Copy( «with.txt» , «where.txt» , true); // копирование с возможностью перезаписи.

File .Copy( «with.txt» , «where.txt» , false); // копирование без перезаписи.

Запись в файл

За запись в файл отвечает класс: StreamWriter .

StreamWriter print = new StreamWriter ( «out.txt» , false ); // перезапись в файл

StreamWriter print2 = new StreamWriter ( «out.txt» , true ); // запись в файл с добавлением

Разница только в false и true . Если true значит можно записывать ТОЛЬКО с добавлением, а если false — значит можно перезаписывать.

После того, как объявили массив, можно через методы: WriteLine и Write записывать в файл.

WriteLine — это запись с переводом на новую строку, а Write — это запись без перевода строки.

Close — это метод, который закрывает файл.

StreamWriter print = new StreamWriter ( «out.txt» , false ); // перезапись в файл
print.Write( «Hi! How are You?» );
print.Close();

Полную программу, которая работает с файлами на C# читайте здесь.

C++. Работа с текстовыми файлами

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

Текстовыми называются файлы, состоящие из любых символов. Они организуются по строкам, каждая из которых заканчивается символом «конца строки». Конец самого файла обозначается символом «конца файла». При записи информации в текстовый файл, просмотреть который можно с помощью любого текстового редактора, все данные преобразуются к символьному типу и хранятся в символьном виде.

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

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

В программах на C++ при работе с текстовыми файлами необходимо подключать библиотеки iostream и fstream.

Для того чтобы записывать данные в текстовый файл, необходимо:

  1. описать переменную типа ofstream.
  2. открыть файл с помощью функции open.
  3. вывести информацию в файл.
  4. обязательно закрыть файл.

Для считывания данных из текстового файла, необходимо:

  1. описать переменную типа ifstream.
  2. открыть файл с помощью функции open.
  3. считать информацию из файла, при считывании каждой порции данных необходимо проверять, достигнут ли конец файла.
  4. закрыть файл.

Запись информации в текстовый файл

Как было сказано ранее, для того чтобы начать работать с текстовым файлом, необходимо описать переменную типа ofstream. Например, так:

ofstream F;

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

F.open(«file», mode);

Здесь F — переменная, описанная как ofstream, file — полное имя файла на диске, mode — режим работы с открываемым файлом. Обратите внимание на то, что при указании полного имени файла нужно ставить двойной слеш. Для обращения, например к файлу accounts.txt, находящемуся в папке sites на диске D, в программе необходимо указать: D:\\sites\\accounts.txt.

Файл может быть открыт в одном из следующих режимов:

  • ios::in — открыть файл в режиме чтения данных; режим является режимом по умолчанию для потоков ifstream;
  • ios::out — открыть файл в режиме записи данных (при этом информация о существующем файле уничтожается); режим является режимом по умолчанию для потоков ofstream;
  • ios::app — открыть файл в режиме записи данных в конец файла;
  • ios::ate — передвинуться в конец уже открытого файла;
  • ios::trunc — очистить файл, это же происходит в режиме ios::out;
  • ios::nocreate — не выполнять операцию открытия файла, если он не существует;
  • ios::noreplace — не открывать существующий файл.
Цукерберг рекомендует:  Поколение Performance технология, изменившая маркетинг

Параметр mode может отсутствовать, в этом случае файл открывается в режиме по умолчанию для данного потока.

После удачного открытия файла (в любом режиме) в переменной F будет храниться true, в противном случае false. Это позволит проверить корректность операции открытия файла.

Открыть файл (в качестве примера возьмем файл D:\\sites\\accounts.txt) в режиме записи можно одним из следующих способов:

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

Если вы хотите открыть существующий файл в режиме дозаписи, то в качестве режима следует использовать значение ios::app.

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

Например, для записи в поток F переменной a, оператор вывода будет иметь вид:

F #include «stdafx.h»
#include
#include
#include
using namespace std ;
int main ( )
<
setlocale ( LC_ALL, «RUS» ) ;
int i, n ;
double a ;
//описывает поток для записи данных в файл
ofstream f ;
//открываем файл в режиме записи,
//режим ios::out устанавливается по умолчанию
f. open ( «D: \\ sites \\ accounts.txt» , ios :: out ) ;
//вводим количество вещественных чисел
cout «n=» ; cin >> n ;
//цикл для ввода вещественных чисел
//и записи их в файл
for ( i = 0 ; i n ; i ++ )
<
cout «a=» ;
//ввод числа
cin >> a ;
f a « \t « ;
>
//закрытие потока
f. close ( ) ;
system ( «pause» ) ;
return 0 ;
>

Чтение информации из текстового файла

Для того чтобы прочитать информацию из текстового файла, необходимо описать переменную типа ifstream. После этого нужно открыть файл для чтения с помощью оператора open. Если переменную назвать F, то первые два оператора будут такими:

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

Например, для чтения данных из потока F в переменную a, оператор ввода будет выглядеть так:

F>>a;

Два числа в текстовом редакторе считаются разделенными, если между ними есть хотя бы один из символов: пробел, табуляция, символ конца строки. Хорошо, когда программисту заранее известно, сколько и какие значения хранятся в текстовом файле. Однако часто известен лишь тип значений, хранящихся в файле, при этом их количество может быть различным. Для решения данной проблемы необходимо считывать значения из файла поочередно, а перед каждым считыванием проверять, достигнут ли конец файла. А поможет сделать это функция F.eof(). Здесь F — имя потока функция возвращает логическое значение: true или false, в зависимости от того достигнут ли конец файла.

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

Для лучшего усвоения материала рассмотрим задачу.

Задача 2

В текстовом файле D:\\game\\accounts.txt хранятся вещественные числа, вывести их на экран и вычислить их количество.

Решение

На этом относительно объемный урок по текстовым файлам закончен. В следующей статье будут рассмотрены методы манипуляции, при помощи которых в C++ обрабатываются двоичные файлы.

C# — Работа с текстовым файлом c#

using System.IO; // подключаем библиотеку для работы с файлами

namespace ConsoleApplication1
<
class Program
<
static void Main( string [] args)
<
// имя файла
string filePath = «D://1.txt» ;

// текст для записи в файл
string text = «Hello!» ;

// открываем файл (стираем содержимое файла)
FileStream fileStream = File.Open(filePath, FileMode.Create);

// получаем поток
StreamWriter output = new StreamWriter(fileStream);

// записываем текст в поток
output.Write(text);

// подключаем библиотеку для работы с файлами
using System.IO;

namespace ConsoleApplication1
<
class Program
<
static void Main( string [] args)
<
// имя файла
string filePath = @ «D:\1.txt» ;

// текст запишем в файл
string text = «Hello!» ;

FileStream fileStream = null;

// проверяем существует ли файл файл
if (!File.Exists(filePath))
fileStream = File.Create(filePath); // создаем файл
else
fileStream = File.Open(filePath, FileMode.Append); // открываем файл и в конец будут добавлены данные

// получаем поток
StreamWriter output = new StreamWriter(fileStream);

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

Дата изменения: 10.10.2020

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

Способы чтения и записи в файл:

  1. Статическими методами класса File.
  2. С помощью методов классов StreamReader и Streamwriter.
  3. С помощью методов классов BinaryReader и BinaryWriter.

Первый способ самый удобный, поскольку позволяет считать или заполнить весь файл буквально в одну строку кода. Благодаря тому, что методы класса File статические, нет необходимости создавать экземпляры объектов, работающих с файлами. Для большинства задач его методы подходят.

Обьекты StreamReader и StreamWriter (BinaryReader и BinaryWriter) возвращаются методами класса FileInfo, как экземпляры, непосредственно работающие с файлом. Код становится более громоздким, но и более гибким, поскольку позволяет организовать сложную систему считывания/записи данных файл, внутри единого блока try/catch для обработки исключений.

Для использования любого из методов в этом разделе нужно включить в код программы библиотеку System.IO перед их вызовом.

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

Считывание данных из файла

Функционал класса File позволяет считывать из файла данные в виде строк. Основной метод, который используется при этом – ReadAllText.

При вызове через имя класса он:

  1. Открывает файл.
  2. Считывает все строки файла.
  3. Закрывает файл.

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

Подобные инструкции можно воплотить через использования метода ReadToEnd класса StreamReader.

Запись в файл

Функционал записи текста в файл в классе File главным образом представлен методом WriteAllText. Метод имеет два параметра: строковое имя файла и строку или массив строк, которые нужно записать в файл. Метод сам откроет файл, запишет в него текст и закроет его. Весь код умещается в одну строку:

Те же самые иструкции легко выполнить методами класса StreamWriter.

Пример:

Запись в фалй с помощью средств класса StreamWriter можно выполнить асинхронноЮ если применить асинхронную версию метода записи. Например:

Раздел 2 Основы работы с файлами и директориями в C#

Глава 1 Использование контролов OpenFileDialog и SaveFileDialog для работы с файлами

Для изучения работы с контролами OpenFileDialog и SaveFileDialog создадим новое решение (подробно о создании проекта решения было раказано в первом разделе книги) или изменим уже ипользованный проект (убрав коды обработчиков событий нажатия кнопок, изменив надписи и картиночки) и поместим на форму контролы RichTextBox, OpenFileDialog и SaveFileDialog. Контролы OpenFileDialog и SaveFileDialog не визуальные и, потому, разместились ниже формы. Проект решения с которым будем работать примет вид, показанный на Рис.1.

Рис.1 Проект решения для работы с OpenFileDialog и SaveFileDialog

Дважды кликнем на форме (вне контролов) и, таким образом, создадим обработчик Form1_Load, который будет вызываться при каждой загрузки формы и который в дальнейшем будем часто использовать для начальной инициализации параметров программы и переменных. В обработчике запишем код очистки RichTextBox:

Обработчик нажатия кнопки 3 оставим прежний:

Параграф 1 Ипользование контрола OpenFileDialog

Основные свойства OpenFileDialog

Свойство AddExtension разрешает или запрещает автоматическое добавление расширение, указанное в свойстве DefaultExt.

Свойство DefaultExt — расширение, принятое по умолчанию для автоматического добавления к имени файла при AddExtension=true.

Свойство CheckFileExists — используется для получения или устанавки значения, указывающего отображать или нет диалоговое окно предупреждения, если пользователь указал в свойстве FileName имя файла, которого не существует в данной директории и нажал кнопку «Oткрыть» при невыбранном кликом мышки файле. При CheckFileExists=true вместо прерывания будет выдано сообщение, что такого файла нет и исключения не вызывается.

На Рис.2 показано окно предупреждение при FileName=a.doc, CheckFileExists=true и нажатии кнопки «Oткрыть» при невыбранном файле.

Рис.2 Окно предупреждения при CheckFileExists=true

Свойство FileName — имя файла по умолчанию для выборки если была нажата кнопка OK и не выбрн кликом мышки файл в окне диалога.

Свойство CheckPatchExists — используется для получения или устанавки значения, указывающего отображать или нет диалоговое окно предупреждения, если пользователь указал в свойстве FileName имя файла с несуществующим именем директории. Окно полностью анлогично показанному на Рис.2., например, при FileName=С:\3\a.doc и не выбранном файле в директории C:\ и нажатии кнопки «Oткрыть» будет выдано сообщение, поазанное на Рис.3. При CheckPatchExists=true вместо прерывания будет выдано только сообщение.

Рис.3 Окно предупреждения при CheckPatchExists=true

Свойство DereferenceLinks — используется для указания контролу что именно возвращпть при выборе файла ссылки — файл по ссылке (true) или файл самой сылки (false).

Свойства Filter, FilterIndex — фильтр для выбираемых файлов и индекс строки, отображаемой в окошечке «Имя файла». Например значение свойства заданного строкой при FilterIndex=1.

позволит выбрать только текстовые файлы в формате rtf или txt. В окошечке «Тип файла» будет только две строки:

а в окошечке «Имя файла» будет отображена первая.

Свойство InitialDirectory — директория, которая выбирается при старте OpenFileDialog.

Свойство MultiSelect — при значении true позволяет выбрать мышкой при нажатой кнопке Shift или Ctrl несколько файлов и сохранить их имена в свойстве FileNames в виде массива строк.

Свойство ReadOnlyChecked — при значении true позволяет открывать команде OpenFile выбранные файлы только в режиме чтения.

Свойство RestoreDirectory — при true диалоговое окно восстанавливает текущий каталог к первоначальному значению если пользователь изменил каталог при поиске файлов, при false — нет.

Цукерберг рекомендует:  Ищите программиста в себе

Свойство работает только если закрыт поток Stream, созданный методом openFileDialog1.OpenFile().

Свойство ShowHelp — при значении true в окне диалога отображается кнопка «Справка».

Свойство ShowReadOnly — при значении true в окне диалога отображается переключатель «Только для чтения».

Свойство Title — заголовок диалогового окна.

Свойство ValidateNames — при true проверяет допустимость имени для файла применительно к Win32. Никакое заданное по умолчанию в этом случае не добавляется.

Отметим, что ве свойcтва могут быть заданы на этапе проектирования и программно — путем присвоения соответствующих значений.

Загрузка содержимого файла с использованием OpenFileDialog

Утановим для OpenFileDialog следующие значения свойств:

Filter — rtf файлы (*.rtf)|*.rtf

Пометим в директорию C:\ какой либо файл в формате .rtf (например который был создан в первом разделе «a.tf») и загрузим его в RichTextBox. Для этого напишем в обработчике нажатия кнопки 1 следующий код:

Ели мы выбрали файл C:\a.rtf, то это имя отобразится в заглавии формы.

Если теперь в войстве FileName запишем a.rtf, то при открытии диалога буковка «a» появляется в окошечке «Имя файла» и можно выполнить загрузку не выбирая мышкой файл, а сразу нажав кнопочку «OK».

Дотаточно в войстве FileName записать a.doc и повторить то, что только что проделали выше, как получим предупреждение об отсутствии файла (см Рис.2) и файл уже придется выбирать кликом мышки (кстати, отетим еще раз, что если утановить войство CheckFileExists в false то получим возбуждение иключения).

Рассмотрим еще один способ, который позволяет загружать фйлы в формате .txt. Добавим на форму контрол TextBox и установим его свойство MultiLine в true, в обработчике Form1_Load допишем строку

а cвойству Filter присвоим значение

В обработчике события нажатия кнопки 1 напишем код для чтения текстовых файлов.

Ели прочитаем текстовый файл в формате .rtf, то увидим уже знакомое нам по первому разделу содержимое файла, а при чтении текстового файла в формате .txt именно текст (см Рис.4).

Рис.4 Чтение файлов в формате .rtf(сле) и.txt(спрва) в ткстовом режиме

Параграф 2 Ипользование контрола SaveFileDialog

Основные свойства SaveFileDialog

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

Сохранение информации в файл с использованием SaveFileDialog

Уcтановим для SaveFileDialog следующие значения свойств:

Filter — rtf файлы (*.rtf)|*.rtf|txt файлы(*.txt)|*.txt

Последнее актуально именно для SaveFileDialog и позволяет не задавать в окошечке «имя файла» полное имя если файл будет сохраняться как .rtf файл.

Для обработчика события нажатия кнопки 2 нпишем следующий код:

C# — Работа с текстовым файлом c#

Файл (file) это коллекция данных, сохраненных на диске с определенным именем и по определенному пути на этом диске. Когда файл открывается для чтения или записи, он становится потоком (stream).

Поток в сущности это последовательность байт, проходящих через канал обмена данными. Есть 2 основных потока: поток ввода (input stream) и поток вывода (output stream). Поток ввода используется для чтения данных из файла (read operation) и поток вывода используется для записи данных в файл (write operation).

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

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

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

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

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

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

FileStream = new FileStream( ,
,
,
);

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

Назначение параметров конструктора класса FileStream:

Параметр Описание
FileMode Перечисление FileMode определяет различные методы, которые применяются для работы с файлами:

Append — открывает существующий файл и перемещает позицию ввода (так называемый курсор файла) в конец файла, или создает новый файл, если указанный по имени файл не существует.
Create — создает новый файл.
CreateNew — указывает операционной системе, что она должна создать новый файл.
Open — открывает существующий файл.
OpenOrCreate — указывает операционной системе, что нужно открыть файл, если он существует, и если он не существует, то нужно создать новый файл.
Truncate — откроет существующий файл и обрежет его, в результате файл станет пустым (его размер составит 0 байт).

FileAccess Перечислитель, определяющий доступ к файлу: Read (только чтение), ReadWrite (чтение и запись) и Write (только запись).
FileShare Перечисление, определяющее совместное использование файла:

Inheritable — позволяет наследовать доступ к дескриптору файла для дочерних процессов.
None — запрещает совместный доступ к текущему файлу.
Read — позволяет другим потокам открыть файл на чтение.
ReadWrite — позволяет совместную работу с файлом на чтение и запись.
Write — позволяет другим потокам открыть файл на запись.

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

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

[Более сложные операции с файлами на C#]

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

Классы StreamReader и StreamWriter помогают в доступе к информации текстового файла на чтение и запись [2]. Они наследуются из абстрактного базового класса Stream, который поддерживает чтение и запись байт файлового потока.

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

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

Следующий пример показывает чтение файла mytext.txt, находящегося в каталоге TEMP диска C:.

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

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

Метод Описание
public override void Close() Закрывает текущий объект StreamWriter и связанный с ним нижележащий поток.
public override void Flush() Очищает все буферы текущего записывающего объекта, что приводит к тому, что все хранящиеся в буфере (кэше) данные записываются в нижележащий поток.
public virtual void Write(bool value) Записывает текст, представляющий двоичное значение в строку текста или в поток (унаследовано от TextWriter).
public override void Write(char value) Записывает символ в поток.
public virtual void Write(decimal value) Записывает текстовое представление десятичного значения в строку текста или поток.
public virtual void Write(double value) Записывает текстовое представление 8-байтного значения в формате с плавающей точкой в строку текста или поток.
public virtual void Write(int value) Записывает текстовое представление 4-байтного значения целого числа со знаком в строку текста или поток.
public override void Write(string value) Записывает строку в поток.
public virtual void WriteLine() Записывает терминатор строки в строку текста или поток.

Для получения полного списка методов обратитесь к документации C# от Microsoft.

Следующий пример демонстрирует запись файла names.txt в текущий каталог.

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

Классы BinaryReader и BinaryWriter помогают реализовать чтение и запись двоичных файлов [3].

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

Следующая таблица описывает часто используемые методы класса BinaryReader.

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

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

Следующая таблица описывает часто используемые методы класса BinaryWriter.

Метод Описание
public override void Close() Закрывает объект BinaryWriter и нижележащий поток.
public virtual void Flush() Очищает все буферы текущего записывающего объекта, в результате всего все буферизированные (кэшированные) данные передаются в нижележащее устройство (говоря по-русски, сбрасываются на диск).
public virtual long Seek(int offset, SeekOrigin origin) Устанавливает позицию в текущем потоке.
public virtual void Write(bool value) Записывает 1 байт двоичного значения в текущий поток, где 0 обозначает false и 1 обозначает true.
public virtual void Write(byte value) Записывает байт (беззнаковое 8-битное целое число) в текущий поток и перемещает текущую позицию в потоке вперед на 1 байт.
public virtual void Write(byte[] buffer) Записывает массив байт в нижележащий поток.
public virtual void Write(char ch) Записывает символ Unicode в текущий поток, и перемещает текущую позицию в потоке вперед на количество байт в соответствии с текущей кодировкой (Encoding) и записанным символом.
public virtual void Write(char[] chars) Записывает массив символов в текущий поток и перемещает текущую позицию потока вперед в соответствии с используемой кодировкой (Encoding) и спецификой символов, записанных в поток.
public virtual void Write(double value) Записывает 8-байтное значение с плавающей точкой в текущий поток и перемещает позицию потока вперед на 8 байт.
public virtual void Write(int value) Записывает 4-байтное целое число со знаком в текущий поток и перемещает позицю потока вперед на 4 байта.
public virtual void Write(string value) Записывает строку, снабженную префиксом длины, в поток в текущей кодировке BinaryWriter, и перемещает текущую позицию потока вперед в соответствии с кодировкой и спецификой символов записанной строки.

Для получения полного списка методов обратитесь к документации C# от Microsoft.

Следующий пример демонстрирует чтение и запись двоичного файла:

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

C# позволяет Вам работать с директориями и файлами, используя набор специальных классов, таких как DirectoryInfo и FileInfo [4].

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

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

Свойство Описание
Attributes Возвращает значения атрибутов текущего файла или директории.
CreationTime Возвращает время создания текущего файла или директории.
Exists Возвращает двоичное значение, показывающее, существует ли директория.
Extension Возвращает строку, представляющую расширение файла.
FullName Возвращает полный путь до директории или файла.
LastAccessTime Возвращает время последнего доступа к текущему файлу или директории.
Name Возвращает имя этого экземпляра DirectoryInfo.

Часто используемые методы класса DirectoryInfo:

Метод Описание
public void Create() Создает директорию.
public DirectoryInfo CreateSubdirectory(string path) Создает подкаталог или подкаталоги по указанному пути. Для этого экземпляра класса DirectoryInfo указанный путь может быть относительный.
public override void Delete() Удаляет директорию этого DirectoryInfo, если она пустая.
public DirectoryInfo[] GetDirectories() Возвратит подкаталоги текущей директории.
public FileInfo[] GetFiles() Возвратит список файлов из текущей директории.

Для получения полного списка свойств и методов обратитесь к документации C# от Microsoft.

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

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

Свойство Описание
Attributes Возвратит атрибуты для текущего файла.
CreationTime Возвратит время создания текущего файла.
Directory Возвратит экземпляр директории, которой принадлежит файл.
Exists Возвратит двоичное значение, показывающее, существует файл или нет.
Extension Возвратит строку, представляющую расширение файла.
FullName Возвратит полный путь до файла.
LastAccessTime Возвратит время последнего доступа к текущему файлу.
LastWriteTime Возвратит время последней активности записи файла.
Length Возвратит размер в байтах текущего файла.
Name Возвратит имя файла.

Часто используемые методы класса FileInfo:

Метод Описание
public StreamWriter AppendText() Создает StreamWriter, который добавляет текст к файлу, представленному этим экземпляром FileInfo.
public FileStream Create() Создает файл.
public override void Delete() Полностью удаляет файл с диска.
public void MoveTo(string destFileName) Переименовывает (перемещает в новое место) указанный файл с предоставлением опции указания нового имени файла.
public FileStream Open(FileMode mode) Откроет файл в указанном режиме.
public FileStream Open(FileMode mode, FileAccess access) Откроет файл в указанном режиме с доступом только чтение, только запись или и чтение, и запись.
public FileStream Open(FileMode mode, FileAccess access, FileShare share) Откроет файл в указанном режиме с доступом только чтение, только запись или и чтение, и запись, и с указанной опцией совместного доступа.
public FileStream OpenRead() Создает FileStream только для чтения.
public FileStream OpenWrite() Создает FileStream только для записи.

Для получения полного списка свойств и методов обратитесь к документации C# от Microsoft.

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

После этого скомпилируйте и запустите эту программу, это отобразит имена файлов и их соответствующие размеры в директории Windows.

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

Введение

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

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

Область имен 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)

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

lsreg’s IT blog

Чтение файла

Прочитать данные из файла можно несколькими способами:

  • File.ReadAllText(@»D:\myfile.txt») — вернет содержимое файла одной строкой.
  • File.ReadAllLines(@»D:\myfile.txt») — содержимое файла в виде массива строк.
  • File.ReadAllBytes(@»D:\myfile.txt») — содержимое файла в виде массива байт.

Запись в текстовый файл

запишет в файл переданный текст. Если файл с заданным именем не существует — он будет создан.

XML сериализация

В C# есть встроенные возможности для сохранения объектов в XML и загрузки из XML. Сохраняются при это только свойства. Значения полей сохраняться не будут.
Создаем класс, экземпляры которого будем сохранять и загружать:

Теперь нам нужны 2 метода, для сохранения и загрузки:

Содержимое файла D:\cat.txt:

Архивация файлов в C#

Начиная с версии 4.5 в .Net Framework появились классы для работы с zip архивами. Для их использования нужно подключить к проекту сборку System.IO.Compression.FileSystem.
Создать zip архив очень просто:

Первым аргументом передается путь к папке, содержимое которой архивируется. Вторым — имя архива.
Распаковать архив тоже не сложно:

Первый аргумент — путь к архиву, второй — путь к папке, в которую будет распакован архив.

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