Сегодня я решил рассказать тем, кто еще только начинает изучать язык программирования 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 играют очень важную. Они отвечают за флаги, которые будут проставлены файлу, пока он занят вашей программой. Именно они могут запретить/разрешить доступ к файлу сторонним программам, либо «попросить» разрешение на чтение уже занятого файла.