Опубликован: 12.02.2013 | Доступ: свободный | Студентов: 785 / 44 | Длительность: 17:51:00
Специальности: Программист
Самостоятельная работа 10:

Изолированное хранилище

< Лекция 6 || Самостоятельная работа 10 || Самостоятельная работа 11 >
Аннотация: Цель работы: изучение возможностей использования изолированного хранилища для хранения данных и настроек приложения Silverlight.

Основные теоретические сведения

Практически в любом приложении требуется хранить данные, которые приложение использует при работе. Приложение Silverlight должно сохранять настройки и информацию, с которой работает пользователь, игре XNA требуется хранить информацию о достижениях игрока, список рекордов и игровые настройки. Программы Windows Phone могут использовать изолированное хранилище для хранения подобной информации. Хранилище называют "изолированным", потому что приложение не может получить доступ к данным, которые сохраняет другое приложение, в отличие от компьютеров под управлением Windows, в которых любая программа может получить доступ к любому файлу в системе.

В изолированном хранилище можно сохранять большие объёмы данных вплоть до максимально доступного объёма памяти для хранения данных в телефоне. В устройствах Windows Phone имеется минимум 8 Гб встроенного хранилища, которое совместно используется программами для работы с мультимедиа файлами (музыка, изображения и видео) и всеми приложениями в устройстве.

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

Изолированное хранилище можно использовать точно так же, как и файловую систему. Единственная разница заключается в способе подключения приложения к хранилищу. Однако, после того как программа подключится к файловой системе, она может создавать потоки для передачи данных в файлы и даже использовать папки для создания структурированного файлового хранилища. Так программа может сохранять большие объёмы данных.

Классы для работы с файлами изолированного хранилища

Необходимые классы для работы с изолированным хранилищем находятся в пространствах имён System.IO и System.IO.IsolatedStorage. В последнем описаны классы IsolatedStorageFile и IsolatedStorageFileStream, которые позволяют работать с файлами изолированного хранилища.

Класс IsolatedStorageFile содержит следующие методы для работы с файловой системой:

  • GetUserStoreForApplication — получает изолированное хранение с областью действия пользователя, соответствующее вызову удостоверения приложения кода;
  • Close — закрывает ранее открытое хранилище;
  • CreateDirectory — создает в области ограниченного действия изолированного хранения папку;
  • MoveDirectory — перемещает указанный каталог и его содержимое в новое расположение;
  • DeleteDirectory — удаляет из области ограниченного действия изолированного хранилища папку;
  • DirectoryExists — определяет, указывает ли заданный путь на существующий каталог в изолированном хранилище;
  • GetDirectoryNames — перечисляет каталоги в корневой папке изолированного хранилища;
  • CreateFile — создает файл в изолированном хранилище;
  • CopyFile — копирует существующий файл в новый файл;
  • OpenFile — открывает файл в заданном режиме, с заданным уровнем доступа для чтения и записи и с разрешением на совместный доступ;
  • MoveFile — перемещает указанный файл в новое расположение и позволяет указать для файла новое имя;
  • DeleteFile — удаляет из области ограниченного действия изолированного хранилища файл;
  • GetFileNames — перечисляет имена файлов в корневой папке изолированного хранилища;
  • FileExists — определяет, указывает ли заданный путь на существующий файл в изолированном хранилище;
  • GetCreationTime — возвращает дату и время создания заданного файла или каталога;
  • GetLastAccessTime — возвращает дату и время последнего обращения к указанному файлу или каталогу;
  • GetLastWriteTime — возвращает дату и время последней операции записи в указанный файл или каталог.

Работа с классом IsolatedStorageFileStream аналогична работе с другими потоками.

Ниже представлены методы для сохранения строки в файле и для загрузки строки из файла.

private void saveText(string filename, string text)
{
    using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())
    {
        using (IsolatedStorageFileStream rawStream = isf.CreateFile(filename))
        {
            StreamWriter writer = new StreamWriter(rawStream);
            writer.Write(text);
            writer.Close();
        }
    }
}

private bool loadText(string filename, out string result)
{
    result = "";
    using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())
    {
        if (isf.FileExists(filename))
        {
            try
            {
                using (IsolatedStorageFileStream rawStream =
                    isf.OpenFile(filename, System.IO.FileMode.Open))
                {
                    StreamReader reader = new StreamReader(rawStream);
                    result = reader.ReadToEnd();
                    reader.Close();
                }
            }
            catch
            {
                return false;
            }
        }
        else
        {
            return false;
        }
    }
    return true;
}

Метод saveText создаёт поток, связанный с указанным файлом в изолированном хранилище, и записывает в него текст. Потоки работают точно так же, как и в других программах на C#. В нашем случае метод создаёт объект StreamWriter, которому передаётся текст.

Метод loadText возвращает значение false, если входной файл не найден, или при чтении файла возникает исключение. Метод ReadToEnd позволяет делать в программе многострочные текстовые записи.

Классы для работы с хранилищем настроек приложения

Часто программам нужно сохранить некоторые настройки, которые являются простыми значениями. В этом случае использовать файлы и потоки очень неудобно. Чтобы облегчить сохранение настроек, программа Windows Phone может использовать хранилище для настроек. Оно работает как словарь, который может сохранить любое количество пар "имя—значение" в изолированной области.

В Windows Phone можно использовать класс IsolatedStorageSettings, который является словарём для хранения настроек в системе. Словарь настроек хранит коллекцию объектов и использует строку в качестве ключа.

Можно изменить рассмотренные выше методы, добавив использование изолированного хранилища настроек:

private void saveText(string filename, string text)
{
    IsolatedStorageSettings isolatedStore =
        IsolatedStorageSettings.ApplicationSettings;
    isolatedStore.Remove(filename);
    isolatedStore.Add(filename, text);
    isolatedStore.Save();
}

Эта версия метода saveText использует имя файла в качестве ключа. Он удаляет запись с существующим ключом, значение которого является именем файла, и добавляет переданный текст в качестве нового элемента. Метод Remove вызывается для удаления элемента из словаря. Метод принимает в качестве параметра значение ключа элемента, который нужно удалить. Если элемента с таким ключом в словаре нет, метод Remove возвращает значение false, но в нашем примере это не имеет значения. После выполнения изменений в хранилище, необходимо вызвать метод Save для сохранения этих изменений.

Метод loadText будет считывать значения из словаря настроек:

private bool loadText(string filename, out string result)
{
    IsolatedStorageSettings isolatedStore =
        IsolatedStorageSettings.ApplicationSettings;
    result = "";
    try
    {
        result = (string)isolatedStore[filename];
    }
    catch
    {
        return false;
    }
    return true;
}

Метод loadText выбирает запрошенный элемент из хранилища настроек. Его использование осложняется тем, что в отличие от класса Dictionary класс IsolatedStorageSettings не содержит метод ContainsKey, который используется для определения, есть ли в словаре данный элемент. Наш метод перехватывает исключение, которое генерируется, если элемент не найден, и возвращает значение false, чтобы указать, что такого элемента нет.

Дополнительные материалы

Сайт MSDN: http://msdn.microsoft.com/ru-ru/library/3ak841sy.

Задание к работе

  1. Откройте в Visual Studio созданный в предыдущей работе проект программы для Windows Phone.
  2. Добавьте в программу возможность добавления и удаления элементов списка, сохранения списка в файле изолированного хранилища и его загрузки из файла при запуске программы.
  3. Добавьте в программу возможность изменения параметров отображения страницы программы (размер шрифта текста заголовка программы, цвет фона и др.), их сохранения в хранилище приложения и применения при запуске программы.
  4. Запустите программу и проверьте правильность её работы.
  5. Составьте отчёт о проделанной работе. Включите в отчёт необходимые листинги программы.
< Лекция 6 || Самостоятельная работа 10 || Самостоятельная работа 11 >