Isolated Storage in Windows Desktop Apps using .Net

As we are becoming more and more aware of, giving programs unfettered access to a computer is not a great idea. Unfortunately, many programs still need to save some sort of state data about themselves. To bridge the needs of applications to save data and the desire of administrators and users to use more limited security settings, the .NET Framework supports the concept of isolated storage.

What Is Isolated Storage?

Running code with limited privileges has many benefits given the presence of predators who are foisting viruses and spyware on your users. The .NET Framework has several mechanisms for dealing with running as least-privileged users. By using isolated storage to save your data, you will have access to a safe place to store information without needing to resort to having users grant access to specific files or folders in the file system. The main benefit of using isolated storage is that your application will run regardless of whether it is running under partial, limited, or full-trust.

The IsolatedStorageFile Class

The IsolatedStorageFile class provides the basic functionality to create files and folders in isolated storage.

IsolatedStorageFile Static/Shared Methods

Name Description
GetMachineStoreForApplication Retrieves a machine-level store for calling the Click-Once,application
GetMachineStoreForAssembly Retrieves a machine-level store for the assembly that called
GetMachineStoreForDomain Retrieves a machine-level store for the AppDomain within the current,assembly that called.
GetStore Retrieves stores based on the IsolatedStorage- Scope enumerator
GetUserStoreForApplication Retrieves a user-level store for the Click-Once application that,called
GetUserStoreForAssembly Retrieves a user-level store for the assembly that called
GetUserStoreForDomain Retrieves a user-level store for the AppDomain within the current,assembly that called

How to Create a Store

Before you can save data in isolated storage, you must determine how to scope the data you want in your store. For most applications, you will want to choose one of the following two methods:

Assembly/Machine 

This method creates a store to keep information that is specific to the calling assembly and the local machine. This method is useful for creating application-level data.

IsolatedStorageFile machineStorage = IsolatedStorageFile.GetMachineStoreForAssembly();

Assembly/User

This method creates a store to keep information that is specific to the calling assembly and the current user. This method is useful for creating user-level data. If you need to specify the user for the store, you will need to use impersonation.

IsolatedStorageFile userStorage = IsolatedStorageFile.GetUserStoreForAssembly();


Example Code:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.IO.IsolatedStorage;

namespace ConfigurationStorage
{
    public partial class ConfigurationStorage : Form
    {
        public ConfigurationStorage()
        {
            InitializeComponent();
        }

        private void ConfigurationStorage_Load(object sender, EventArgs e)
        {
            comboBox_Car.Items.AddRange(new object[] {
                                                        "BMW","Mercitez Benz", "Honda Civic",
                                                        "Mistibushi Lancer", "Toyota Supra",
                                                        "SUV"
                                                     });
            comboBox_Color.Items.AddRange(new object[] { "Red", "Green", "Blue" });
            comboBox_HolDest.Items.AddRange(new object[] { "Singapore", "Paris", "Las Vegas", "Perl Harbour" });
            comboBox_Singer.Items.AddRange(new object[] { "Shakira Mabarak", "Enriquae Iglesias", "Eminem", "Snoop Dogg", "Shina Twain" });
            comboBox_Sports.Items.AddRange(new object[] { "Cricket", "Football", "Tennis", "WWE", "Hockey" });

            comboBox_Car.SelectedIndex = 0;
            comboBox_Color.SelectedIndex = 0;
            comboBox_HolDest.SelectedIndex = 0;
            comboBox_Singer.SelectedIndex = 0;
            comboBox_Sports.SelectedIndex = 0;

            CheckAndLoadPrefs();
        }

        private void button_Save_Click(object sender, EventArgs e)
        {
            IsolatedStorageFile userStore = IsolatedStorageFile.GetUserStoreForAssembly();
            IsolatedStorageFileStream userStream = new IsolatedStorageFileStream("ConfigurationStorage_UserPreferences.settings", FileMode.Create, userStore);

            StreamWriter writer = new StreamWriter(userStream);
            writer.Write("Car:" + comboBox_Car.SelectedIndex.ToString() + "," +
                         "Color:" + comboBox_Color.SelectedIndex.ToString() + "," +
                         "HolidayDestination:" + comboBox_HolDest.SelectedIndex.ToString() + "," +
                         "Singer:" + comboBox_Singer.SelectedIndex.ToString() + "," +
                         "Sports:" + comboBox_Sports.SelectedIndex.ToString() + ",");
            writer.Close();
            userStream.Close();
            userStore.Close();
        }

        void CheckAndLoadPrefs()
        {
            IsolatedStorageFile userStore = IsolatedStorageFile.GetUserStoreForAssembly();
            string[] files = userStore.GetFileNames("ConfigurationStorage_UserPreferences.settings");

            if(files.Length > 0)
            {
                IsolatedStorageFileStream userStream = new IsolatedStorageFileStream("ConfigurationStorage_UserPreferences.settings", FileMode.Open, userStore);
                StreamReader reader = new StreamReader(userStream);

                string data = reader.ReadToEnd();

                int pos = 0;
                int colonpos = 0;
                int commapos = -1;
                string userObject = "";
                string indexStr = "";
                foreach (char c in data)
                {
                    if (c == ':')
                    {
                        colonpos = pos;
                        userObject = data.Substring(commapos + 1, colonpos - commapos - 1);                                               
                    }                    
                    if (c == ',')
                    {
                        commapos = pos;
                        indexStr = data.Substring(colonpos + 1, commapos - colonpos -1);
                        int index = Int32.Parse(indexStr);
                        if (userObject == "Car")
                        {
                            comboBox_Car.SelectedIndex = index;
                        }
                        else if (userObject == "Color")
                        {
                            comboBox_Color.SelectedIndex = index;
                        }
                        else if (userObject == "HolidayDestination")
                        {
                            comboBox_HolDest.SelectedIndex = index;
                        }
                        else if (userObject == "Singer")
                        {
                            comboBox_Singer.SelectedIndex = index;
                        }
                        else if (userObject == "Sports")
                        {
                            comboBox_Sports.SelectedIndex = index;
                        } 
                    }
                    pos++;
                }
                reader.Close();
                userStream.Close();
            }
            userStore.Close();
        }
    }
}