Главная » Silverlight » Изолированное хранилище

0

Коду Silverlight запрещено записывать информацию в произвольное место фай­ловой системы и считывать оттуда. Очевидно, что если бы это было разрешено, была бы нарушена безопасность браузера. Однако во многих случаях приложениям Silverlight нужно сохранять информацию надолго. Для этого используется изолирован­ное хранилище (isolated storage).

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

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

Новые средства. В Silverlight 3 добавлен класс SaveFileDialog, дополняющий существовавший класс OpenFileDialog и предоставляющий возможность сохранить заданный пользователем файл за пределами изолированного хранилища. Класс SaveFileDialog рассматривается в конце главы.

Концепция изолированного хранилища

предоставляет виртуальную файловую систему, которая позволяет сохранять данные, специфичные для приложения и пользователя. Объем со­храняемых данных по умолчанию не может превышать 1 Мбайт. Приложение может попросить пользователя задать больший объем.

Создаваемое приложением Silverlight изолированное хранилище немного похоже на файлы cookie, создаваемые веб-страницей. Браузер управляет изолированным храни­лищем, предотвращая попытки заполнить диск или вмешаться в файловую систему.

Область видимости изолированного хранилища

Уникальное изолированное хранилище создается для каждой комбинации пользова­телей и приложений. Это означает, что приложение может создать много хранилищ, по одному для каждого пользователя. Аналогично для пользователя может быть создано много хранилищ, по одному для каждого приложения Silverlight. Изолированное храни­лище не является специфичным для конкретного браузера. Например, запуская прило­жение сначала в Internet Explorer, а затем в Firefox, пользователь имеет доступ к одному и тому же хранилищу.

Примечание. Пользователь с правами администратора Windows имеет доступ к изолированным хранилищам других пользователей.

Критически важным фактором, служащим для идентификации приложения Silverlight, является адрес URL файла ХАР. Это означает следующее.

•       Разные файлы ХАР, размещенные в одной и той же папке одного и того же веб­сервера, имеют разные изолированные хранилища.

•       Если веб-сайт хостируется в разных доменах, каждый экземпляр сайта получит собственное изолированное хранилище.

•       Разные тестовые страницы, хостирующие одно и то же приложение Silverlight, пользуются одним и тем же изолированным хранилищем.

•       Если переименовать папку или файл ХАР, приложение получит новое изолиро­ванное хранилище.

•       Если изменить идентификатор GUID, версию или другие метаданные приложе­ния Silverlight, оно получит доступ к прежнему изолированному хранилищу.

•       Если заменить одно приложение Silverlight другим, но с тем же именем файла ХАР, оно получит доступ к изолированному хранилищу предыдущего приложения.

Что хранят в изолированных хранилищах

— подходящее место для хранения небольшого количе­ства несущественной информации. Например, в нем обычно хранятся параметры, спец­ифичные для пользователя, предпочтения пользователя, информация о предыдущих его действиях. Кроме того, в изолированных хранилищах часто сохраняются временные данные. Предположим, пользователь должен заполнить форму, состоящую из нескольких частей, которые расположены на разных страницах, а затем передать форму веб-службе для постоянного хранения. При каждом переходе от одной части формы к другой теку­щие данные можно сохранять в изолированном хранилище. Затем, когда пользователь заполнит все части формы и передаст ее веб-службе, хранилище можно удалить. Такой способ предотвращает потерю данных, когда приложение не может установить контакт с веб-службой (например, из-за сбоев сети) или когда пользователь ошибочно запускает приложение повторно (например, случайно щелкнув на кнопке Назад). В любом случае приложение при запуске проверяет содержимое хранилища и предоставляет пользовате­лю возможность либо загрузить хранящиеся данные, либо ввести их повторно.

В изолированном хранилище (в отличие от кеша браузера) данные хранятся посто­янно, срока годности у них нет. Кроме того, содержимое хранилища не удаляется, когда пользователь явно удаляет временные файлы Интернета. Однако изолированное хра­нилище — не очень подходящее место для хранения важных документов, потому что в нем не создается резервная копия, и его содержимое легко случайно удалить (например, если пользователь изменяет регистрационную информацию). Кроме того, изолирован­ное хранилище не пригодно для кеширования ресурсов (например, внешних изображе­ний и мультимедийных файлов). При создании приложения Silverlight часто возникает искушение сохранять в нем что угодно, однако не забывайте, что оно предназначено для небольшого объема данных и не является заменителем кеша HTTP.

Использование изолированного хранилища

Изолированные хранилища легко использовать, потому что они основаны на той же потоковой модели, что и доступ к обычным файлам в .NET. Для доступа к изолирован­ному хранилищу используются типы пространства имен System. 10. IsolatedStorage, являющегося базовой частью инфраструктуры Silverlight.

Открытие изолированного хранилища

Надстройка Silverlight создает изолированное хранилище автоматически. Для взаимодействия с ним используется класс IsolatedStorageFile. Получить объект isolatedStorageFile для текущего пользователя и приложения можно, вызвав стати­ческий метод IsolatedStorageFile.GetUserStoreForApplicationО.

IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication();

Метод возвращает именно то, что обычно нужно, — специфичное для пользователя место, в котором можно хранить данные. Однако в классе IsolatedStorageFile есть еще один похожий статический метод GetUserStoreForSite (). Он предоставляет для хранения сайт в текущем домене, доступный для всех приложений Silverlight, но только для текущего пользователя. Обычно он используется при разработке группы приложе­ний Silverlight, когда нужно хранить для них общую информацию.

В любом случае, после открытия изолированного хранилища и получения объекта IsolatedStorageFile, можно создавать и сохранять файлы.

Управление файлами

Имя класса IsolatedStorageFile может ввести в заблуждение, потому что он пред­ставляет не один файл, а коллекцию файлов, находящихся в хранилище. Методы клас­са IsolatedStorageFile аналогичны методам управления файлами, представленными в классах File и Directory полнофункциональных приложений .NET. Наиболее важные методы приведены в табл. 18.1.

Таблица 18.1. Методы класса IsolatedStorageFile, предназначенные для управления файлами

Имя метода

Описание

CreateDirectory()

Создание в хранилище новой папки с заданным именем

DeleteDirectory()

Удаление папки

CreateFile ()

Создание нового файла с заданным именем; метод возвращает объект IsolatedStorageFileStream, который можно использовать для записи данных в файл

DeleteFile ()

Удаление файла

Remove()

Удаление изолированного хранилища со всеми файлами и папками

OpenFile ()

Открытие файла; метод возвращает объект потока IsolatedStorageFileStream, который можно использовать для манипулирования файлом; обычно метод OpenFile () используется для открытия существующего файла в режиме чтения; значения FileMode и FileAccess позволяют создать новый файл или переопределить существующий

Окончание табл. 18.1

Имя метода

Описание

FileExists О

Метод возвращает значение true или false, в зависимости от того, существует ли указанный файл в хранилище; перегруженную версию метода можно использовать для поиска файла с помощью регулярного выражения и метасимволов ? и *

DirectoryExists ()

Возвращает true или false, в зависимости от существования указанной папки

GetFileNames ()

Возвращает массив строк; каждая строка содержит имя файла в корневой папке хранилища; перегруженную версию метода с одним аргументом можно использовать для указания вложенной папки; в аргументе допус­кается использование регулярных выражений с метасимволами ? и *

GetDirectoryNames

Возвращает массив строк с именами папок, находящихся в корневой папке; в перегруженной версии метода можно указать другую папку; в аргументе допустимы метасимволы ? и *

Запись и чтение данных

С помощью методов, перечисленных в табл. 18.1, можно создавать файлы и потоки для записи и чтения данных. Однако класс isolatedStorageFileStream редко исполь­зуется непосредственно, потому что с его помощью можно читать и записывать данные только по байтам. Вместо него чаще используют один из более мощных классов, пред­ставленных в пространстве имен System. 10 и служащих оболочками потоков.

•       Для чтения и записи текстовых строк используются классы StreamReader и StreamWriter. С их помощью можно извлекать данные по строкам или боль­шими блоками, например, вызвав метод StreamReader.ReadToEndO .

•       Для компактной записи или чтения типизированных данных используются клас­сы BinaryWriter и BinaryReader. Например, метод BinaryReader. Readlnt32 () извлекает из файла 32-битовое целое значение, метод BinaryReader.Read- String () — строку и т.д.

Приведенный ниже код создает в текущем изолированном хранилище новый файл

date. txt и записывает в него текущую дату в текстовом формате.

і

// Запись в изолированное хранилище

try {

using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())

{

using (IsolatedStorageFileStream stream = store.CreateFile("date.txt"))

{

StreamWriter writer = new StreamWriter(stream); writer.Write(DateTime.Now); writer.Close();

}

lblStatus.Text = "Data written to date.txt";

}

}

catch (Exception err) <

lblStatus.Text = err.Message;

Извлечь информацию из хранилища так же просто. Для этого достаточно открыть поток в режиме чтения.

// Извлечение данных из хранилища

try

{

using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication ())

{

using (IsolatedStorageFileStream stream = store.OpenFile("date.txt", FileMode.Open))

{

StreamReader reader = new StreamReader(stream); lblData.Text = reader.ReadLine (); reader.Close();

}

}

}

catch (Exception err) (

// При попытке открыть несуществующий файл // генерируется исключение lblStatus.Text = err.Message;

}

Файл date. txt можно найти по следующему маршруту.

С:\Users\[имя_пользователя]\AppData\LocalLow\Microsoft\^ Silverlight\is\[уникальный_идентификатор]

Ниже приведен пример автоматически сгенерированной папки, добавленной в ко­нец указанного маршрута.

С:XUsersXmatthewXAppDataXLocalLowXMicrosoftXSilverlightX1^

is\sid3dsxe .ulyXlstesiyg.ezxXsX1^

atkj 2 fb5vjnabwj sx2nfj 3htrsqlkulh\f\date.txt

К счастью, беспокоиться о внутренней структуре папок на жестком диске не нужно. Извлекать данные из хранилища с помощью методов FileNames () и OpenFile () класса IsolatedStorageFile можно, задавая относительные маршруты.

Выяснить маршрут текущего изолированного хранилища можно с помощью отладчика Visual Studio. В режиме прерывания наведите указатель на объект IsolatedStorageFile и посмотрите значение переменной m_AppFilesPath (рис. 18.1).

Рис. 18.1. Получение маршрута изолированного хранилища

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

Источник: Мак-Дональд, Мэтью. Silverlight 3 с примерами на С# для профессионалов. : Пер. с англ. —- М. : ООО «И.Д. Вильяме», 2010. — 656 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии