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