Чтение и запись данных в файл
86C# и .NET --- Многопоточность и файлы --- Чтение и запись данных в файл
Операции чтения и записи данных в файлы в принципе очень просты, однако выполняются они не через объекты DirectoryInfo и FileInfo. В .NET Framework 4 это делается через объект File. Позже будет показано, как их выполнять с помощью других классов, представляющих обобщенную концепцию потока (stream).
До появления .NET Framework 2.0 вокруг того, как следует производить чтение и запись данных в файлы, велось много споров. Классы из .NET Framework можно было использовать, но такой подход не был простым. В версии .NET Framework 2.0 класс File был расширен; с его помощью стало возможным выполнение операций чтения и записи данных в файлы с помощью всего одной строки кода. То же самое доступно и в .NET Framework 4.
Чтение из файла
Рассмотрим пример чтения файла, создав приложение WPF, которое содержит обычное текстовое поле, кнопку и многострочное текстовое поле. В конечном итоге должна получиться форма, подобная показанной ниже. Используйте следующую разметку:
<Window x:Class="FileRead.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition Width="auto"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<TextBlock Margin="5">Введите путь к файлу</TextBlock>
<TextBox Grid.Row="1" x:Name="txb" FontSize="12"
VerticalContentAlignment="Center" Margin="5"></TextBox>
<Button Grid.Row="1" Grid.Column="1" Padding="5" Margin="5"
x:Name="buttonRead" Click="buttonRead_Click">Прочитать</Button>
<TextBox x:Name="txbTextFile" Grid.Row="2" Grid.ColumnSpan="2" Margin="5,0,5,5"
Padding="5" TextWrapping="Wrap"></TextBox>
</Grid>
</Window>
using System;
using System.IO;
using System.Windows;
using System.Windows.Controls;
namespace FileRead
{
/// <summary>
/// Логика взаимодействия для MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void buttonRead_Click(object sender, RoutedEventArgs e)
{
txbTextFile.Text = File.ReadAllText(txb.Text);
}
}
}
При построении данного приложения первым шагом является добавление оператора using для включения пространства имен System.IO. После этого с помощью события buttonRead_Click кнопки Прочитать многострочное текстовое поле заполняется содержимым файла. Затем к содержимому файла можно получать доступ методом File.ReadAllText(). Как не трудно заметить, чтение файла осуществляется с помощью единственного оператора.
Метод ReadAllText() открывает указанный файл, считывает его содержимое и затем закрывает его. Возвращаемое значение метода ReadAllText() представляет собой строку, в которой хранится все содержимое указанного файла. Результат может выглядеть примерно так, как показано на рисунке:

Для открытия файлов и работы с ними предназначены также методы ReadAllBytes и ReadAllLines. Метод ReadAllBytes позволяет открывать двоичные файлы и считывать их содержимое в байтовый массив. Упомянутый выше метод ReadAllText возвращает все содержимое файла в виде одной строки. Такое поведение не всегда подходит. Вместо этого может требоваться работать с содержимым файла в построчной манере, т.е. строка за строкой. Для этого служит метод ReadAllLines, который возвращает массив строк с содержимым файла.
Запись в файл
Помимо чтения, библиотека базовых классов (Base Class Library — BCL) в .NET Framework существенно упрощает также и запись данных в файлы. Вдобавок к методам для чтения файлов ReadAllText(), ReadAllLines() и ReadAllBytes() , в ней предлагаются методы, предназначенные для записи данных в файлы — WriteAllText() , WriteAllBytes() иWriteAllLines().
Рассмотрим пример, основанный на том же проекте WPF, но на этот раз многострочное текстовое поле будет использоваться для ввода данных в файл. Код обработчика событий buttonRead_Click теперь должен выглядеть следующим образом:
private void buttonRead_Click(object sender, RoutedEventArgs e)
{
File.WriteAllText(txb.Text, txbTextFile.Text);
}
Скомпонуйте и запустите приложение. Введите в первом текстовом поле значение С:\Testing.txt, а во втором — какой-нибудь текст, после чего щелкните на кнопке. Внешне ничего не произойдет, однако, если заглянуть после этого в корневой каталог на диске С:, то можно будет обнаружить там файл Testing.txt с содержимым, которое было введено во втором текстовом поле.
Метод WriteAllText() создал в указанном каталоге новый текстовый файл, поместил в него предоставленное в поле содержимое и закрыл файл. Неплохо для всего одной строки кода. Если запустить приложение снова и указать тот же файл (Testing.txt), но задать новое содержимое для него, щелчок на кнопке опять заставит приложение выполнить ту же операцию. Новое содержимое не добавляется к старому, а полностью заменяет его. Методы WriteAllText(), WriteAllBytes() и WriteAllLines() перезаписывают предыдущее содержимое файла, поэтому при их применении следует соблюдать осторожность.
Поскольку данные могут записываться не только на диск, но и в другие места (например, в именованные каналы или в память), важно уметь работать с файловым вводом-выводом в .NET, используя потоки в качестве средства для перемещения содержимого файлов. Об этом пойдет речь в следующей статье.