Использование Isolated Storage в Windows Phone 7
Для хранения данных в Windows Phone 7 используется механизм Isolated Storage, который успешно используется в приложениях Silverlight. Давайте попробуем поработать с Isolated Storage.
Isolated Storage предполагает, что для каждого приложения существует изолированная среда для хранения данных.Приложения не могут получать доступ к хранилищу других приложений (в основном из соображений безопасности). Само хранилище при этом разделяется на две части:
- Isolated Settings Storage;
- Isolated File Storage
Хранилище Isolated Settings Storage предназначено для хранения настроек приложения. Хранение настроек осуществляется в специальном словаре (ключ-значение) и очень похоже на то, как работают аналогичные механизмы в настольной платформе.
Хранилище Isolated File Storage предназначено для хранения различных данных в виде файлов. При этом это хранилище можно структурировать, используя разбиение на папки. Фактически, это – некоторый доступ к файловой системе изолированного хранилища.
Для организации механизма хранения данных в Windows Phone 7 SDK используется следующий набор объектов:
- System.IO.IsolatedStorage.IsolatedStorageSettings – предоставляет доступ к словарю (ключ-значение) настроек для текущего хранилища (Isolated Settings Storage);
- System.IO.IsolatedStorage.IsolatedStorageFile – позволяет получить доступ к хранилищу данных(Isolate File Storage);
- System.IO.IsolatedStorage.IsolatedFileStream – позволяет получить доступ к содержимому файла в хранилище (Isolate File Storage);
- System.IO.IsolatedStorage. IsolatedStorageException – исключение, возникающее при ошибках в работе с хранилищем.
Хранение настроек
Для доступа к настройкам приложения используется класс IsolatedStorageSettings. Этот класс представляет собой словарь, при помощи которого по ключу можно обратиться к конкретной настройке. Для доступа к значению используется индексатор. Например, получить доступ к ключу “count” можно используя следующий код.
int count = (int)System.IO.IsolatedStorage.IsolatedStorageSettings.ApplicationSettings["count"];
Если указанного ключа нет в настройках приложения, то будет сгенерировано соответствующее исключение. Поэтому чтобы избежать подобных неприятностей следует проверять наличие нужного ключа перед обращением к нему.
int count = 0; if (System.IO.IsolatedStorage.IsolatedStorageSettings.ApplicationSettings.Contains("count") == true)
Аналогичным образом можно работать с любыми ключами Isolated Settings Storage.
Изменение настроек приложения также выполняется достаточно просто. Для этого следует изменить нужный ключ и вызвать метод Save.
System.IO.IsolatedStorage.IsolatedStorageSettings.ApplicationSettings["count"] = count; System.IO.IsolatedStorage.IsolatedStorageSettings.ApplicationSettings.Save();
Так, например, можно написать несложный код по подсчету количества запусков приложения и отображения этой информации пользователю. Для этого добавим на форму элемент TextBlock и будем инкрементировать счетчик при каждом запуске приложения. Эту логику можно поместить, например, в конструктор.
public MainPage() < InitializeComponent() SupportedOrientations = SupportedPageOrientation.Portrait | SupportedPageOrientation.Landscape; int count = 0; if (System.IO.IsolatedStorage.IsolatedStorageSettings.ApplicationSettings.Contains("count") == true) < count = (int)System.IO.IsolatedStorage.IsolatedStorageSettings.ApplicationSettings["count"]; >count++; System.IO.IsolatedStorage.IsolatedStorageSettings.ApplicationSettings["count"] = count; System.IO.IsolatedStorage.IsolatedStorageSettings.ApplicationSettings.Save() textBlock1.Text = count.ToString(); >
На самом деле, работать с настройками в таком виде не очень удобно – каждый раз приходится проверять наличие ключа в настройках и выполнять приведение типов. По-хорошему, тут еще нужно проверять на соответствие типов перед выполнением приведения типов. Поэтому давайте создадим небольшую надстройку для класса IsolatedStorageSettings.
Надстройка будет представлять с собой несколько методов-расширений для класса IsolatedStorageSettings. Для получения настроек в типизированном виде создадим метод GetSetting, который будет принимать в качестве параметра имя ключа и значение по умолчанию (если, например, ключ не найден). Также сделаем перегруженную версию метода, чтобы можно было не указывать значение по умолчанию. Внутри этого метода выполним все действия, которые мы видели с вами раньше.
public static class IsolatedStorageSettingsExtensions < public static T GetSetting(this System.IO.IsolatedStorage.IsolatedStorageSettings settings, string keyName) < return GetSetting(settings, keyName, default(T)) >public static T GetSetting(this System.IO.IsolatedStorage.IsolatedStorageSettings settings, string keyName, T defaultValue) < if (settings != null) < if (settings.Contains(keyName) == true) < try < return (T)settings[keyName]; >catch (InvalidCastException) < >> > return defaultValue; > >
Теперь доступ к настройкам немного упростился. Для того, чтобы получить значение, можно просто вызвать метод-расширение с нужными параметрами. Перепишем с учетом этого, код, который использовался выше.
public MainPage() < InitializeComponent(); SupportedOrientations = SupportedPageOrientation.Portrait | SupportedPageOrientation.Landscape; int count = System.IO.IsolatedStorage.IsolatedStorageSettings.ApplicationSettings.GetSetting("count"); count++; System.IO.IsolatedStorage.IsolatedStorageSettings.ApplicationSettings["count"] = count; System.IO.IsolatedStorage.IsolatedStorageSettings.ApplicationSettings.Save(); textBlock1.Text = count.ToString(); >
Мы также можем указать значение по умолчанию, которое будет использоваться, если ключ не найден в настройках. Например, мы можем вести отсчет с числа 10.
int count = System.IO.IsolatedStorage.IsolatedStorageSettings.ApplicationSettings.GetSetting("count", 10);
Аналогичный метод расширения сделаем и для сохранения настроек. Тогда весь класс, содержащий методы-расширения будет выглядеть следующим образом.
public static class IsolatedStorageSettingsExtensions < public static T GetSetting(this System.IO.IsolatedStorage.IsolatedStorageSettings settings, string keyName) < return GetSetting(settings, keyName, default(T)); >public static T GetSetting(this System.IO.IsolatedStorage.IsolatedStorageSettings settings, string keyName, T defaultValue) < if (settings != null) < if (settings.Contains(keyName) == true) < try < return (T)settings[keyName]; >catch (InvalidCastException) < >> > return defaultValue; > public static void SaveSetting(this System.IO.IsolatedStorage.IsolatedStorageSettings settings, string keyName, T value) < if (settings != null) < settings[keyName] = value; settings.Save(); >> >
При этом немного упростится код, считывающий и изменяющий настройки приложения.
public MainPage() < InitializeComponent(); SupportedOrientations = SupportedPageOrientation.Portrait | SupportedPageOrientation.Landscape; int count = System.IO.IsolatedStorage.IsolatedStorageSettings.ApplicationSettings.GetSetting("count", 10); System.IO.IsolatedStorage.IsolatedStorageSettings.ApplicationSettings.SaveSetting("count", ++count); textBlock1.Text = count.ToString(); >
Хранение данных
Для доступа к файловому хранилищу используется класс IsolatedStorageFile. Обратившись к его статическому методу GetUserStoreForApplication() можно получить доступ к объекту, предоставляющему всевозможные методы для работы с файлами и папками:
- GetDirectoryNames – позволяет получить список всех папок в заданном контексте;
- GetFileNames – позволяет получить список всех файлов в заданном контексте;
- CreateDirectory – позволяет создать папку;
- DeleteDirectory – позволяет удалить папку;
- DirectoryExists – позволяет проверить наличие папки;
- CreateFile = позволяет создать файл;
- OpenFile – позволяет открыть файл для чтения и/или изменения;
- DeleteFile – позволяет удалить файл;
- FileExists – позволяет проверить наличие файла.
Как видно, для работы с файлом используется метод OpenFile. Этот файл возвращает поток, с которым можно работать так, как мы это делаем обычно (например, используя StreamReader/StreamWriter). Например, код для записи информации в файл будет выглядеть следующим образом.
using (var file = IsolatedStorageFile.GetUserStoreForApplication().CreateFile("test1.txt")) < using (var fileWriter = new StreamWriter(file)) < fileWriter.WriteLine(DateTime.Now.ToString()); >>
Аналогичным образом выглядит код для считывания содержимого файла.
using (var file = IsolatedStorageFile.GetUserStoreForApplication().OpenFile("test1.txt", FileMode.Open)) < using (var fileReader = new StreamReader(file)) < MessageBox.Show(fileReader.ReadToEnd(), "File", MessageBoxButton.OK); >>
Давайте добавим в конструктор нашего приложения логику, согласно которой приложение будет проверять наличие файла в хранилище и, если его там нет, записывать в него текущее время; в противном случае – отображать его пользователю.
public MainPage() < // . if (IsolatedStorageFile.GetUserStoreForApplication().FileExists("test1.txt") == false) < using (var file = IsolatedStorageFile.GetUserStoreForApplication().CreateFile("test1.txt")) < using (var fileWriter = new StreamWriter(file)) < fileWriter.WriteLine(DateTime.Now.ToString()); >> > else < using (var file = IsolatedStorageFile.GetUserStoreForApplication().OpenFile("test1.txt", FileMode.Open)) < using (var fileReader = new StreamReader(file)) < MessageBox.Show(fileReader.ReadToEnd(), "File", MessageBoxButton.OK); >> > >
Таким образом, без особых усилий мы создали небольшое приложение, работающее с Isolated Storage — Isolated Settings Storage и Isolated File Storage. Как видно, на это не требуется много усилий, а работа с хранилищем очень похожа на аналогичные операции в настольном Silverilght. Тем не менее, по сравнению с хранилищем в Silverilght, хранилище в Windows Phone не имеет ограничений, связанных с объемом хранимой информации.
Успехов вам в создании ваших мобильных приложений!
IsolatedStorage — что это за папка, можно ли удалить?

- Описание
- Разбираемся
- Вывод
Приветствую уважаемые ребята! Будем разбираться сегодня с папкой IsolatedStorage — что это? Можно ли удалить? От какой программы? Постараемся все выяснить. Помните, что просто так удалять нельзя никакие папки, впрочем как и программы, иначе потом компьютер может работать нестабильно.
Описание
IsolatedStorage — папка, представляет из себя изолированное хранилище для настроек, может использоваться некоторыми установленными программами на ПК.
Разбираемся
- Скажу сразу, что нормальной информации об этой папки нет. Есть инфа из мира программирования, на основе которой и постараемся понять предназначение папки.
- Эта папка представляет из себя изолированное пространство, в котором могут хранится данные разных программ. Доступ к этим данным возможен только программам-создателям, а также контролируется системой безопасностью.
- Но зачем это нужно? Программы могут использовать изолированное хранилище для сохранения данных в собственной изолированной части файловой системы без указания точного пути. Это данные с сайта Майкрософт.
- Если программа А создала данные в директории IsolatedStorage, то программа Б доступ к ним получить не сможет. Только программа А, потому что она является создателем этих данных и она их в папку IsolatedStorage и поместила. Такие правила.
- Какие данные могут хранится в IsolatedStorage? Например настройки или служебные данные. Но повторюсь, что точной информации о предназначении папки — нет. Известно одно — она может использоваться разными приложениями, которые установлены на вашем ПК. Удалять эту папку я категорически не советую.
- Изолированное хранилище используется не только в обычных Windows для компьютера, но и в мобильных системах Windows Phone 7.
У меня на ПК данная папка тоже есть:

Что важно — создана была папка еще в январе (сейчас у меня октябрь).. примерно тогда я вроде и устанавливал операционку. То есть она была с самого начала. Внутри — папка с непонятным названием, которая тоже была создана в январе:

Ну и внутри этой папки — непонятный файл, был создан уже вначале февраля:

Все. Больше никаких данных в папке нет. Поэтому я делаю вывод, что ничего страшного нет, это не вирус, не левое ПО, это системная директория Windows, которую некоторые программы могут использовать для хранения данных. Весит IsolatedStorage у меня очень мало, меньше мегабайта, поэтому удалять точно смысла нет и вам не советую.
Но если папка весит много — можно попробовать почистить систему утилитой CCleaner, правда сомневаюсь что поможет. При желании — можно пойти на эксперимент, переименовать IsolatedStorage в IsolatedStorage_ и посмотреть что будет. Перед переименованием желательно создать точку восстановления. Если при переименовании будут проблемы — используйте программу Unlocker. Но если после переименования не будет никаких проблем — пусть папка лежит так.. если и дальше не будет проблем, тогда думаю ее можно удалить. Но все это на свой страх и риск.
Заключение
- IsolatedStorage — директория, является изолированным хранилищем, где могут хранить данные некоторые установленные программы на компьютере.
- Удалять эту папку думаю не стоит — могут быть проблемы при работе некоторого ПО.
Удачи и добра, до новых встреч друзья!
EvenTiles от начала до конца – часть 6
В предыдущем выпуске этой серии о том, как разработать приложение для Windows Phone с нуля, мы использовали IsolatedStorage для сохранения некоторых данных. Поскольку IsolatedStorage — это файловое хранилище на устройстве Windows Phone, предназначенное исключительно для использования одним приложением, может возникнуть проблема с просмотром его содержимого. К счастью, в Windows Phone 7.1 SDK есть инструмент для изучения содержимого IsolatedStorage. В этом эпизоде EvenTiles мы рассмотрим этот инструмент изолированного хранилища .
Isolated Storage Explorer — это инструмент командной строки, который устанавливается вместе с Windows Phone 7.1 SDK в следующую папку:
C: \ Program Files (x86) \ Microsoft SDK \ Windows Phone \ v7.1 \ Tools (64-разрядная ОС)
или
C: \ Program Files \ Microsoft SDK \ Windows Phone \ v7.1 \ Tools (32-разрядная ОС)
Сам инструмент имеет много параметров, чтобы получить содержимое из IsolatedStorage, записать содержимое в IsolatedStorage, указать приложение и указать устройство. В командной строке доступна ограниченная справочная информация:

Чтобы извлечь наши ApplicationSettings из IsolatedStorage для EvenTiles, первое, что нам нужно знать, — это ProductID для нашего приложения. Этот иде можно найти в файле WMAppManifest.xml.
" Title="EvenTiles"
Следующее, что нам нужно сделать, это убедиться, что эмулятор запущен (или физическое устройство подключено). Либо должно быть установлено приложение, но не обязательно, чтобы приложение работало. После передачи следующей команды,

папка C: \ iso будет содержать снимок IsolatedStorage нашего приложения.

Когда мы перетаскиваем файл _ApplicationSettings в Visual Studio 2010, вы можете видеть, что его содержимое представляет собой данные XML, представляющие словарь с одной определенной в нем записью, соответствующей обратной стороне строки нашей вторичной плитки.

Возможно, вам не понравится использование инструмента командной строки для просмотра IsolatedStorage. В этом случае есть хорошие новости для вас. Если вы перейдете по адресу http://wptools.codeplex.com/ , вы найдете Windows Phone Power Tools для загрузки. Этот удобный набор инструментов встраивает различные инструменты SDK, включая инструмент изолированного хранилища, в приложение Windows. С помощью этого приложения вы также можете изучить изолированное хранилище вашего приложения. Используя инструмент Power, также легко записывать новые или измененные файлы в изолированное хранилище вашего приложения. Последнее имеет большой смысл, если вы хотите протестировать новые версии приложений со старым содержимым в IsolatedStorage, например, для переноса старых файлов в новые версии.

На следующем видео показан инструмент изолированного хранилища и инструменты Windows Phone Power в действии.
Поэтому на этот раз мы не добавили функциональность в наше приложение EvenTiles, но важно узнать о полезных инструментах, которые также помогут нам в разработке наших приложений. В следующем выпуске мы поговорим о переключении Tombstoning и Fast Application и о том, что нам нужно сделать в нашем приложении для поддержки этих двух важных состояний выполнения на устройствах Windows Phone.
Где хранить временные файлы?
Нужна временная папка для хранения и обработки файлов. Прочитал на msdn, что можно воспользоваться Path.GetTempPath(). Какие есть нюансы при таком решении? Есть ли другие варианты?
Отслеживать
13.7k 12 12 золотых знаков 43 43 серебряных знака 75 75 бронзовых знаков
задан 16 мар 2018 в 12:08
Александр Пузанов Александр Пузанов
2,785 5 5 золотых знаков 32 32 серебряных знака 64 64 бронзовых знака
Неудобство еще в том, что имя временной папки TEMP.
16 мар 2018 в 12:12
16 мар 2018 в 12:15
Какие есть нюансы при таком решении? Масса. например, если файлов гигабайты, а свободного места на диске не дофига, может случиться неудобность. А также следует учитывать, что путь берётся из переменных среды, с которыми пользователь в принципе имеет право сделать что угодно (за свой счёт, разумеется, но кого это останавливало?). Разумнее затребовать установку временной папки в настройках, а GetTempPath использовать как значение по умолчанию. Неудобство еще в том, что имя временной папки TEMP Почему, позвольте полюбопытствовать?
16 мар 2018 в 12:17
А зачем их хранить? В памяти не помещаются?
16 мар 2018 в 12:26
@Bulson, автоматически ничего не очищается, только вручную с помощью штатной утилиты «Очистка диска» или сторонних решений
16 мар 2018 в 13:17
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Если официальная документация говорит использовать Path.GetTempPath , то я бы на вашем месте именно это и делал.
Вам для доступа в нормально отконфигурированной системе даны App Data ( Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) ) для данных вашего приложения (за которые вы лично ответственны), и временный каталог ( Path.GetTempPath ). Временные данные нужно, понятно, хранить во временном каталоге.
Предупреждение: если вам нужны эти данные между запусками программы, то храните их в App Data, т. к. Temp может быть почищен в любой момент. Хуже того, Temp имеет право быть почищен в процессе работы вашей программы, поэтому открывайте временный файл с эксклюзивным доступом ( FileShare.Read или вообще FileShare.None ), и не закрывайте, пока он вам всё ещё нужен. Кроме того, поскольку Temp доступен всем, я бы на всякий случай не оставлял там важную информацию наподобие паролей пользователя или номера кредитки. (Впрочем, для обеспечения безопасности нужно довольно многое.)
Если пользователь каким-то образом «запортит» временный каталог, это не ваша забота. Покажите сообщение об ошибке и прекращайте работу. Вы не можете бороться с пользователем, разрушающим свою систему: он может, в конце-концов, просто удалить половину файлов .NET Framework, если захочет всё сломать.