Чтение и запись данных в файл

86

Операции чтения и записи данных в файлы в принципе очень просты, однако выполняются они не через объекты 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, используя потоки в качестве средства для перемещения содержимого файлов. Об этом пойдет речь в следующей статье.

Пройди тесты
Лучший чат для C# программистов