Чтение и запись файлов с использованием потоков в С#

Автор: Topol Пятница, Июнь 8th, 2012 Нет комментариев

Рубрика: Программирование

Необходимость чтения и записи данных в файлах возникает при создании любой, более-менее серьезной программы. В основном, работа с файлами в C# осуществляется при помощи потоков. Отметим, что поток данных и поток выполнения (thread) это разные вещи. В наиболее распространенных языках программирования работа с файлами реализована, как правило, двумя способами: в одних внутренними средствами компилятора, интерпретатора, в других с помощью функций и классов подключаемых библиотек.

В C# для работы с файлами мы будем обращаться к подключаемым библиотекам стандартного пакета Microsoft.NET framework. Необходимые классы мы также будем извлекать из пространства имен System.IO.

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

Вкратце о других особенностях работы с потоками данных из библиотеки Microsoft NET framework в C#.

Программа на C# может работать с потоками нескольких типов: стандартные, потоки локальных файлов и потоки, связанные с оперативной памятью. В библиотеке NET Framework все операции по работе с потоками хранятся в классе Object.

Рассмотрим иерархию классов общего предка Object, затем перейдем к конкретному примеру работы с файлами. В C# реализована поддержка большого количества классов для обработки файлов Мы будем использовать в дальнейших примерах только некоторые. Для начала мы разбиремся с иерархзией классов, потом перейдем к конкретному примеру. Основной класс в c# – Object, от него наследуются все остальные, в то числе необходимые нам классы ввода-вывода.

Для работы с файлами нужны следующие классы, унаследованных от Object:

  • BinaryReader – предназначен для побайтового чтения блоков из файла
  • BinaryWriter – предназначен для побайтовой записи из файла
  • File — используется для операций над оглавлениями каталогов.
  • Directory — методы этого класса позволяют манипулировать каталогами файловой системы: создавать, получать список имеющихся файлов, переименовывать, удалять и т.п.
  • Path — используется для работы с именами файлов и путями их расположения.

При работе с классами File и Directory мы используем статические методы, поэтому в программе нет необходимости создавать экземпляры этих классов. Помимо этих классов есть еще один немаловажный базовый класс FileSystemsInfo, от которого унаследованы такие классы как FileInfo, так и DirectoryInfo. Они уже требуют создания экземпляров и т.к. они представляют непосредственно объекты реально существующих каталогов.

FileSystemInfo принадлежит классу MarshalByRefObJect, который предоставляет возможности доступа за границами домена приложений.
Также нам необходимы классы, обеспечивающие методы обработки потоков. Основным классом в этой системе является IO.Stream, унаследованный от класса MarshalByRefObJect и принадлежащий пространству System.
От него образованы следующие классы:
FileStream – позволяет работать с файлами через потоки. Имеет метод seek, чтобы переходить на определенную позицию в потоке данных для их обработки.
Cryptostream – позволяет работать с потоками данных в зашифрованном виде.
NetworkStream – обеспечивает обработку файлов через сетевые протоколы.
BufferedStream — обеспечивает буферизацию данных.

Для работы с потоками данных в формате ЮНИКОД существует класс System, который предоставляет подклассы system.io.StreamWriter и system.io.StreamReader для потоков ввода и потоков вывода. Они имеют по два класса: StreamWritter и StringWriter (Reader) для работы с байтами и со строковым типом данных. Также есть перечисления, которые позволяет определять константы для используемых режимов работы с файлами определения режимов доступа к файлам FileMode и FileShare. Класс MemoryStream необходим для совместного использования потоков и оперативной памяти. Этот класс имеет высокую скорость работы, т.к. доступ к оперативной памяти реализован намного быстрее, нежели доступ к дисковому пространству.

Теперь рассмотрим, как практически реализовываются операции работы с файлами.

FileInfo() – отвечает за создание и удаление файла.
FileInfo myFile = new FileInfo(«myfile.txt»);
myFile.Create();
В конструктор мы передаем имя файла, затем непосредственно создаем его с помощью метода Create. Для удаления файла воспользуемся методом Delete. Он также принадлежит классу FileInfo.
myFile.Delete();
Для записи данных будем использовать поток (Stream), который оперирует непосредственно символами в формате ЮНИКОД. Для этого сначала нужно создать поток данных для записи с помощью класса
StreamWriter sFile = new StreamWriter(“ourFile.txt)
ourFile.WriteLine(“yaapp”);
И обязательно закрываем файл
ourFile.Close();

Открытый файл во время работы программы — очень вредно для кармы компьютера, программиста и вселенной. Также не забываем один момент, что в предыдущем примере метод WriteLine полностью перезаписывает файл. Если же нам нужно добавить данные, то пользуемся триггером AppendText();

  StreamWriter sFile;
  FileInfo myFile = new FileInfo("myFile.txt");
  sFile = myFile.AppendText();
  sFile.WriteLine("GoodFileStream!");
  sFile.Close();

Считывать данные из файла нужно с помощью класса StreamReader и метода ReadLine, который считывает текущий символ из файла и переводит указатель на один символ вперед. Следите, чтобы файл был сохранен в формате Юникод, а то увидите абракадабру при считывании.

StreamReader strRead = new StreamReader("mFile.txt");
  string myStr = "";

    while (!strRead.EndOfStream)
    {
       myStr =  myStr + strRead.ReadLine();
	   // Можно, даже лучше во так  myStr += strRead.ReadLine();
    }

Источник: cisharp.com

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты