C#: Файлы и как с ними работать

Сегодня я решил рассказать тем, кто еще только начинает изучать язык программирования C# о механизме работы с файлами.
Работа с файлами в C# возможна благодаря очень мощному неймспейсу System.IO. Мы рассмотрим две основных возможности данной библиотеки — работа с файлами и работа с текстовыми файлами. Да да, разработчики уделили отдельное внимание методам для работы с текстовыми файлами — за что им стоит сказать огромное спасибо. Ведь это значительно облегчает процесс разработки. Начнем рассматривать методы работы с файлами.

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

Для работы с текстовыми файлами применяются два класса StreamReader и StreamWriter. По названию классов видно, что первый используется для работы с файлами в режиме чтения, второй для работы в режиме записи. Они интуитивно понятны, так как все их методы явно отражают действия. Приведем пример чтения по строкам:

System.IO.StreamReader sr = new System.IO.StreamReader("Путь к файлу", Encoding.Default);
string line = null;
while ((line = sr.ReadLine()) != null)
{
     //в line содержится очередная строчка из файла
}
sr.Close();
//Второй параметр указывает кодировку файла. В большинстве случаев указывается кодировка по умолчанию
//Однако если в результате content содержит так называемые "кракозябры" укажите кодировку файла (этом может быть
//Encoding.UTF8, Encoding.Unicode и другие). Далее в примерах будет всегда указываться кодировка по умолчанию.  

Объект sr так же имеет методы ReadToEnd, ReadBlock и другие. Названия этих методов говорят сами за себя.

Пример записи в файл:

bool append = true; //Если true, то мы дописываем в конец файла, если false то переписываем файл
System.IO.StreamWriter sw = new System.IO.StringWriter("Путь к файлу", append, Encoding.Default);
sw.WriteLine("Строка 1"); //Данный метод приписывает к строке символ \r\n
sw.WriteLine("Строка 2"); 
sw.Write("Строка 3\r\n");//Тоже самое что sw.WriteLine("Строка 3");  
sw.Write("Строка 4");
sw.Write("Строка 5"); //Четвертая строка имеет текст "Строка 4Строка 5" 
//sw.Flush(); //Выгружает буфер в файл, однако метод Close так же содержит данный вызов (см. MSDN)
sw.Close();

Так же стоит отметить, что оба класса реализуют интерфейс IDisposable. А это означает, что предпочтительней использовать конструкцию using.

using (var sr = new System.IO.StreamReader("Путь к файлу", Encoding.Default))
{
     string line = null;
     while ((line = sr.ReadLine()) != null)
     {
          //в line содержится очередная строчка из файла
     }
}

Более того в библиотеке IO есть несколько предопределенных наиболее часто используемых операций. Нет смысла подробно описывать данные функции, нужно просто запомнить их 🙂

Чтение всего текстового файла в переменную

string content = System.IO.File.ReadAllText("Путь к файлу", Encoding.Default);

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

string[] lines = System.IO.File.ReadAllLines("Путь к файлу", Encoding.Default); 

Работа с бинарными файлами в C#

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

//Поток для чтения
System.IO.FileStream fsRead = new System.IO.FileStream("Путь к файлу для чтения", System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite, System.IO.FileShare.ReadWrite);
//Поток для записи
System.IO.FileStream fsWrite = new System.IO.FileStream("Путь к файлу для записи", System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.ReadWrite, System.IO.FileShare.None);

byte[] buffer = new byte[256];
int countReaded = 0;
while ((countReaded = fsRead.Read(buffer, 0, buffer.Length)) > 0) //пока есть что считать из файла
{
   fsWrite.Write(buffer, 0, countReaded); //пишем в новый файл
}

fsRead.Close();
fsWrite.Close();

Примечание: Параметры FileMode, FileAccess и FileShare играют очень важную. Они отвечают за флаги, которые будут проставлены файлу, пока он занят вашей программой. Именно они могут запретить/разрешить доступ к файлу сторонним программам, либо «попросить» разрешение на чтение уже занятого файла.

Запись опубликована в рубрике C# с метками , , , , , , , , , , , , , . Добавьте в закладки постоянную ссылку.