Изолированное хранилище
Основные теоретические сведения
Практически в любом приложении требуется хранить данные, которые приложение использует при работе. Приложение 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.
Задание к работе
- Откройте в Visual Studio созданный в предыдущей работе проект программы для Windows Phone.
- Добавьте в программу возможность добавления и удаления элементов списка, сохранения списка в файле изолированного хранилища и его загрузки из файла при запуске программы.
- Добавьте в программу возможность изменения параметров отображения страницы программы (размер шрифта текста заголовка программы, цвет фона и др.), их сохранения в хранилище приложения и применения при запуске программы.
- Запустите программу и проверьте правильность её работы.
- Составьте отчёт о проделанной работе. Включите в отчёт необходимые листинги программы.