Silverlight - Stockage isolé
Le troisième mécanisme d'accès aux fichiers est Isolated Storagemécanisme, qui fournit le stockage associé à l'utilisateur connecté. L'API présente les données via leStream classe de .NET System.IOespace de noms. Par conséquent, comme pour les autres mécanismes que nous avons examinés jusqu'à présent, vous pouvez utiliser les autres types dansSystem.IO pour travailler avec les flux, vous permettant de stocker des données textuelles ou binaires.
Certaines caractéristiques importantes sont -
Ce mécanisme de stockage est appelé Isolated Storage car le magasin est partitionné et une application Silverlight n'a accès qu'à certaines parties.
Vous ne pouvez accéder à aucune ancienne donnée stockée. Tout d'abord, le magasin est partitionné par utilisateur. Une application Silverlight ne peut pas accéder au magasin pour un utilisateur différent de celui connecté et exécutant l'application.
Cela n'a rien à voir avec les mécanismes d'identification que votre application Web peut utiliser. C'est un point important à retenir car certaines personnes qui partagent des ordinateurs ne se soucient pas de comptes Windows séparés et sont habituées à se connecter et à se déconnecter des sites Web qu'elles utilisent.
Utilisation du stockage isolé
Le stockage isolé n'est pas unique à Silverlight. L'API a été initialement introduite pourWindows Formspour permettre aux applications lancées à partir du Web de stocker des données localement dans des scénarios de confiance partielle. L'implémentation est différente et il n'y a aucun moyen d'accéder à l'intégralité.NET Stockage isolé de Framework de Silverlight, ou vice versa.
Cependant, si vous l'avez utilisé, les étapes ici vous sembleront très familières.
Vous commencez par demander le magasin spécifique à l'utilisateur. Dans ce cas, nous demandons celui de l'application. Si nous voulions que le magasin par site soit partagé par tous les XAP du site, nous appellerionsGetUserStoreForSite au lieu.
L'une ou l'autre méthode renvoie un IsolatedStorageFile object, qui est un nom assez inutile car il représente un répertoire, pas un fichier.
Pour accéder à un fichier, vous devez demander au IsolatedStorageFile pour un Stream.
Nous utilisons le IsolatedStorageFileStream class, et son constructeur vous oblige à passer le IsolatedStorageFile objet comme argument.
Nous créons donc un nouveau fichier dans le magasin. L'emplacement exact du fichier sur le disque est inconnu.
Le répertoire contenant a des éléments aléatoires afin de rendre impossible de deviner le nom du fichier.
Sans cela, il pourrait être possible que des sites Web malveillants placent un fichier sur l'ordinateur de l'utilisateur, puis construisent une URL de fichier pour l'ouvrir, dans l'espoir de tromper l'utilisateur en cliquant sur un lien qui exécute un programme localement.
Il existe diverses autres mesures de protection intégrées à Windows qui tentent d'empêcher que cela se produise, mais il s'agit d'une autre couche de défense au cas où les autres auraient été désactivées ou contournées.
Le fichier sera stocké quelque part dans le profil de l'utilisateur, mais c'est tout ce que vous pouvez en savoir. VotreIsolatedStorageFileStream ne rapportera pas son emplacement réel.
Jetons un coup d'œil à un exemple simple qui suit le nombre de fois que l'application a été exécutée. Le code XAML est donné ci-dessous.
<UserControl x:Class = "StoreRunCount.MainPage"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable = "d"
d:DesignHeight = "300" d:DesignWidth = "400">
<Grid x:Name = "LayoutRoot" Background = "White">
<TextBlock x:Name = "runCountText" FontSize = "20" />
</Grid>
</UserControl>
Voici le code C # dans lequel Isolated storage sont utilisés.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.IO.IsolatedStorage;
using System.IO;
namespace StoreRunCount {
public partial class MainPage : UserControl {
const string RunCountFileName = "RunCount.bin";
public MainPage() {
InitializeComponent();
int runCount = 0;
using (var store = IsolatedStorageFile.GetUserStoreForApplication()) {
if (store.FileExists(RunCountFileName)) {
using (var stm = store.OpenFile(RunCountFileName,
FileMode.Open, FileAccess.Read))
using (var r = new BinaryReader(stm)) {
runCount = r.ReadInt32();
}
}
runCount += 1;
using (var stm = store.OpenFile(RunCountFileName,
FileMode.Create, FileAccess.Write))
using (var w = new BinaryWriter(stm)) {
w.Write(runCount);
}
}
runCountText.Text = "You have run this application " + runCount.ToString() + " time(s)";
}
}
}
Lorsque le code ci-dessus est compilé et exécuté, vous verrez la page Web suivante qui vous montrera combien de fois vous exécutez cette application.
Augmenter votre quota
Les applications peuvent demander plus d'espace si le montant initial est insuffisant pour une raison quelconque. Il n'y a aucune garantie que la demande aboutira. Silverlight demandera à l'utilisateur s'il souhaite accorder plus d'espace à l'application.
En passant, vous n'êtes autorisé à demander plus de stockage qu'en réponse à une entrée utilisateur, telle qu'une click. Si vous essayez de le demander à un autre moment, par exemple lors du chargement du plug-in ou dans un gestionnaire de minuterie, Silverlight échouera automatiquement la demande sans même en avertir l'utilisateur. Le quota supplémentaire n'est disponible que pour les applications avec lesquelles l'utilisateur interagit.
le IsolatedStorageFile object fournit trois membres pour gérer le quota -
- AvailableFreeSpace
- IncreaseQuotaTo
- Quota
Espace libre
La propriété AvailableFreeSpace vous indique la part de votre quota restant libre.
Notez que même un sous-répertoire vide consomme une partie de votre quota car le système d'exploitation doit allouer de l'espace sur le disque pour représenter le répertoire. Ainsi, l'espace disponible peut être inférieur au quota total, moins la taille de la somme de tous vos fichiers.
Augmenter le quota
Si vous ne disposez pas de suffisamment d'espace pour continuer, demandez-en plus en appelant le IncreaseQuotaTo méthode.
Quota
Ici, nous utilisons la troisième propriété, Quota, pour découvrir la taille actuelle du quota, puis nous ajoutons le montant supplémentaire dont nous avons besoin pour obtenir notre nouveau quota demandé.
La méthode renvoie soit True ou Falsepour indiquer si nous recevons ce que nous avons demandé. Notez que Silverlight peut décider d'allouer plus d'espace que vous n'en avez demandé.
Voici un exemple simple pour augmenter le quota, lorsque l'utilisateur clique sur le bouton. Le code XAML est donné ci-dessous.
<UserControl x:Class = "ChangeQuota.MainPage"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable = "d"
d:DesignHeight = "300" d:DesignWidth = "400">
<Grid x:Name = "LayoutRoot" Background = "White">
<TextBlock x:Name = "infoText" FontSize = "20" TextWrapping = "Wrap" />
<Button x:Name = "increaseQuota" Content = "Increase" HorizontalAlignment = "Center"
FontSize = "20"
VerticalAlignment = "Center" Click = "increaseQuota_Click" />
</Grid>
</UserControl>
Voici la mise en œuvre de click événement au cours duquel le quota est augmenté.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.IO.IsolatedStorage;
namespace ChangeQuota {
public partial class MainPage : UserControl {
public MainPage() {
InitializeComponent();
}
private void increaseQuota_Click(object sender, RoutedEventArgs e) {
using (IsolatedStorageFile isoStore =
IsolatedStorageFile.GetUserStoreForApplication()) {
long newQuota = isoStore.Quota + 10240;
if (isoStore.IncreaseQuotaTo(newQuota)) {
infoText.Text = "Quota is " + isoStore.Quota + ", free space: " +
isoStore.AvailableFreeSpace;
} else {
infoText.Text = "Meanie!";
}
}
}
}
}
Lorsque le code ci-dessus est compilé et exécuté, vous verrez la sortie suivante.
Lorsque vous cliquez Increase, l'invite apparaît. Il demande d'augmenter leQuota être 10KB plus grand que ce qu'il est déjà.
Lorsque vous cliquez Yes, il imprime ensuite la quantité de quota disponible.
Nous vous recommandons d'exécuter les exemples ci-dessus pour une meilleure compréhension.