Опубликован: 02.08.2013 | Доступ: свободный | Студентов: 464 / 16 | Длительность: 18:38:00
Специальности: Программист
Самостоятельная работа 10:

Хранение данных на устройстве

Обратите внимание на то, что для работы с рассматриваемыми здесь возможностями нам понадобилось подключить пространства имен Windows.Storage и System.IO.

Обработчик события нажатия на кнопку объявлен с модификатором async. Он нужен нам для того, чтобы мы могли в данном обработчике использовать оператор await. Это – элементы асинхронного программирования, которые необходимы при выполнении операций с файлами. Чтение или запись файла – это операции, которые могут длиться достаточно долго для того, чтобы выполнение их в потоке пользовательского интерфейса приложения (синхронно) привело к заметным задержкам.

При получении объекта StorageFile для файла мы обращаемся к пакету приложения с использованием схемы <ms-appx:///>, которая используется при работе с API из пространства имен Windows. Похожее обращение, для других API, можно выполнить, используя схему <appdata:\>. Файлы, хранящиеся в установочном пакете приложения, доступны только для чтения. Приложения не имеют доступа к данным других приложений.

Получив объект StorageFile, мы открываем его для чтения, после чего считываем содержимое файла в текстовое поле txtHello.

В Листинге 33.3. приведен код страницы LocalFolder.xaml

<phone:PhoneApplicationPage
    x:Class="P10_1.LocalFolder"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    mc:Ignorable="d"
    shell:SystemTray.IsVisible="True">

    <!--LayoutRoot представляет корневую сетку, где размещается все содержимое страницы-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <!--TitlePanel содержит имя приложения и заголовок страницы-->
        <StackPanel Grid.Row="0" Margin="12,17,0,28">
            <TextBlock Text="ДАННЫЕ" Style="{StaticResource PhoneTextNormalStyle}"/>
            <TextBlock Text="локальные" Margin="9,-7,0,0" 
Style="{StaticResource PhoneTextTitle1Style}"/>
        </StackPanel>

        <!--ContentPanel – поместите здесь дополнительное содержимое-->
        <Grid x:Name="ContentPanel" Grid.Row="1" 
Margin="12,0">
            <TextBox 
        Name="textBox1" 
        HorizontalAlignment="Left"
        Height="72" 
        Margin="0,22,0,0" 
        TextWrapping="Wrap" 
        Text="Введите текст" 
        VerticalAlignment="Top" Width="456"/>
            <Button 
        Name='btnWrite' 
        Content="Записать"
        HorizontalAlignment="Left" 
        Margin="10,94,0,0" 
        VerticalAlignment="Top"
        Width="175" 
        Click="btnWrite_Click"/>
            <TextBlock 
        Name="textBlock1" 
        HorizontalAlignment="Left"
        Margin="10,293,0,0" 
        TextWrapping="Wrap" Text=""
        VerticalAlignment="Top" 
        Height="61" 
        Width="436"/>
            <Button 
        Name="btnRead" 
        Content="Прочитать"
        HorizontalAlignment="Left" 
        Margin="10,374,0,0" 
        VerticalAlignment="Top"
        Width="175" 
        IsEnabled="False"
        Click="btnRead_Click"/>
        </Grid>
    </Grid>
</phone:PhoneApplicationPage>
Листинг 33.3. Код файла LocalFolder.xaml

Здесь есть текстовое поле для ввода текста, кнопки для выполнения записи данных в файл, создаваемый в локальной папке приложения, и для чтения этого файла. При чтении данных, записанных в файл, они выводятся в текстовый блок.

В Листинге 33.4 приведен код файла LocalFolder.xaml.cs

using System;
using System.Windows;
using Microsoft.Phone.Controls;

using System.IO;
using System.Threading.Tasks;
using Windows.Storage;

namespace P10_1
{
    public partial class LocalFolder : PhoneApplicationPage
    {
        public LocalFolder()
        {
            InitializeComponent();
        }

        private async void btnWrite_Click(object sender, RoutedEventArgs e)
        {
            await WriteToFile();

            // Обновление пользовательского интерфейса.
            this.btnWrite.IsEnabled = false;
            this.btnRead.IsEnabled = true;
        }

        //Запись файла
        private async Task WriteToFile()
        {
            // Получим текстовые данные из текстового поля. 
            byte[] fileBytes = System.Text.Encoding.UTF8.GetBytes(this.textBox1.Text.ToCharArray());

            // Получим локальную папку.
            StorageFolder local = Windows.Storage.ApplicationData.Current.LocalFolder;

            // Создадим новую папку с именем DataFolder.
            var dataFolder = await local.CreateFolderAsync("DataFolder",
                CreationCollisionOption.OpenIfExists);

            // Создадим в новой папке файл DataFile.txt.
            var file = await dataFolder.CreateFileAsync("DataFile.txt",
            CreationCollisionOption.ReplaceExisting);

            // Запишем данные из текстового поля в файл.
            using (var s = await file.OpenStreamForWriteAsync())
            {
                s.Write(fileBytes, 0, fileBytes.Length);
            }
        }

        //Чтение файла
        private async void btnRead_Click(object sender, RoutedEventArgs e)
        {
            await ReadFile();

            // Обновим интерфейс.
            this.btnWrite.IsEnabled = true;
            this.btnRead.IsEnabled = false;
        }

        private async Task ReadFile()
        {
            // Получим локальную папку.
            StorageFolder local = Windows.Storage.ApplicationData.Current.LocalFolder;

            if (local != null)
            {
                // Получим папку DataFolder.
                var dataFolder = await local.GetFolderAsync("DataFolder");

                // Получим файл.
                var file = await dataFolder.OpenStreamForReadAsync("DataFile.txt");

                // Прочтем данные файла и запишем в текстовое поле.
                using (StreamReader streamReader = new StreamReader(file))
                {
                    this.textBlock1.Text = streamReader.ReadToEnd();
                }
            }
        }
    }
}
Листинг 33.4. Код файла LocalFolder.xaml.cs