Silverlight - Isolierte Lagerung
Der dritte Dateizugriffsmechanismus ist Isolated StorageMechanismus, der dem angemeldeten Benutzer zugeordneten Speicher bereitstellt. Die API präsentiert Daten über dieStream Klasse aus .NET System.IONamespace. Daher können Sie, wie bei den anderen Mechanismen, die wir bisher untersucht haben, die anderen Typen in verwendenSystem.IO um mit den Streams zu arbeiten und Text- oder Binärdaten zu speichern.
Einige wichtige Merkmale sind -
Dieser Speichermechanismus wird aufgerufen Isolated Storage weil der Speicher partitioniert ist und eine Silverlight-Anwendung nur auf bestimmte Teile zugreifen kann.
Sie können nicht auf alte gespeicherte Daten zugreifen. Zunächst wird der Speicher pro Benutzer partitioniert. Eine Silverlight-Anwendung kann für einen anderen Benutzer als den angemeldeten Benutzer, der die Anwendung ausführt, keinen Zugriff auf den Store erhalten.
Dies hat nichts mit Identifizierungsmechanismen zu tun, die Ihre Webanwendung möglicherweise verwendet. Dies ist ein wichtiger Punkt, den Sie beachten sollten, da einige Personen, die Computer gemeinsam nutzen, sich nicht mit separaten Windows-Konten beschäftigen und es gewohnt sind, sich nur bei den von ihnen verwendeten Websites an- und abzumelden.
Isolierten Speicher verwenden
Isolierter Speicher gilt nicht nur für Silverlight. Die API wurde ursprünglich für eingeführtWindows Formsüber das Web gestartete Anwendungen können Daten lokal in Teilvertrauensszenarien lokal speichern. Die Implementierung ist anders und es gibt keine Möglichkeit, auf die vollständige Version zuzugreifen.NET Isolierter Speicher von Framework von Silverlight oder umgekehrt.
Wenn Sie es jedoch verwendet haben, werden die Schritte hier sehr vertraut aussehen.
Sie fragen zunächst nach dem benutzerspezifischen Geschäft. In diesem Fall fragen wir nach dem für die Anwendung. Wenn wir möchten, dass der Site-Store von allen XAPs auf der Site gemeinsam genutzt wird, rufen wir anGetUserStoreForSite stattdessen.
Jede Methode gibt eine zurück IsolatedStorageFile Objekt, das ein ziemlich wenig hilfreicher Name ist, da dies ein Verzeichnis darstellt, keine Datei.
Um auf eine Datei zuzugreifen, müssen Sie die IsolatedStorageFile Für ein Stream.
Wir nehmen das IsolatedStorageFileStream Klasse, und sein Konstruktor erfordert, dass Sie die übergeben IsolatedStorageFile Objekt als Argument.
Also erstellen wir eine neue Datei im Store. Der genaue Speicherort der Datei auf der Festplatte ist nicht bekannt.
Das enthaltende Verzeichnis enthält zufällige Elemente, damit der Name der Datei nicht erraten werden kann.
Ohne dies könnten böswillige Websites möglicherweise eine Datei auf dem Computer des Benutzers ablegen und dann eine Datei-URL erstellen, um sie zu öffnen, in der Hoffnung, den Benutzer dazu zu bringen, auf einen Link zu klicken, der ein Programm lokal ausführt.
In Windows sind verschiedene andere Sicherheitsvorkehrungen integriert, die dies verhindern sollen. Dies ist jedoch eine weitere Verteidigungsstufe für den Fall, dass die anderen deaktiviert oder umgangen wurden.
Die Datei wird irgendwo im Benutzerprofil gespeichert, aber das ist so viel, wie Sie darüber wissen können. IhreIsolatedStorageFileStream wird seinen wahren Standort nicht melden.
Schauen wir uns ein einfaches Beispiel an, das nachverfolgt, wie oft die Anwendung ausgeführt wurde. Unten ist der XAML-Code angegeben.
<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>
Hier ist der C # -Code, in dem Isolated storage werden verwendet.
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)";
}
}
}
Wenn der obige Code kompiliert und ausgeführt wird, wird die folgende Webseite angezeigt, auf der angezeigt wird, wie oft Sie diese Anwendung ausführen.
Erhöhen Sie Ihre Quote
Anwendungen benötigen möglicherweise mehr Speicherplatz, wenn der anfängliche Betrag aus irgendeinem Grund nicht ausreicht. Es gibt keine Garantie dafür, dass die Anfrage erfolgreich ist. Silverlight fragt den Benutzer, ob er der Anwendung gerne mehr Speicherplatz gewährt.
Übrigens dürfen Sie nur als Reaktion auf Benutzereingaben wie a mehr Speicherplatz anfordern click. Wenn Sie versuchen, es zu einem anderen Zeitpunkt abzufragen, z. B. beim Laden des Plug-Ins oder in einem Timer-Handler, schlägt Silverlight die Anforderung automatisch fehl, ohne den Benutzer dazu aufzufordern. Ein zusätzliches Kontingent ist nur für die Anwendungen verfügbar, mit denen der Benutzer interagiert.
Das IsolatedStorageFile Objekt bietet drei Mitglieder für die Verwaltung des Kontingents -
- AvailableFreeSpace
- IncreaseQuotaTo
- Quota
AvailableFreeSpace
Die AvailableFreeSpace-Eigenschaft gibt an, wie viel von Ihrem Kontingent frei bleibt.
Beachten Sie, dass selbst ein leeres Unterverzeichnis einen Teil Ihres Kontingents beansprucht, da das Betriebssystem Speicherplatz auf der Festplatte zuweisen muss, um das Verzeichnis darzustellen. Daher ist der verfügbare Speicherplatz möglicherweise geringer als das Gesamtkontingent abzüglich der Gesamtgröße aller Ihrer Dateien.
IncreaseQuotaTo
Wenn Sie nicht genügend Speicherplatz haben, um fortzufahren, fordern Sie mehr an, indem Sie die anrufen IncreaseQuotaTo Methode.
Quote
Hier verwenden wir die dritte Eigenschaft, Quota, um die aktuelle Kontingentgröße zu ermitteln, und fügen dann den zusätzlichen Betrag hinzu, den wir benötigen, um unser neues angefordertes Kontingent zu erhalten.
Die Methode gibt entweder zurück True oder Falseum anzuzeigen, ob uns das zugewiesen wird, wonach wir gefragt haben. Beachten Sie, dass Silverlight möglicherweise mehr Speicherplatz zuweist, als Sie angefordert haben.
Hier ist ein einfaches Beispiel, um die zu erhöhen quota, wenn auf die Schaltfläche geklickt wird. Unten ist der XAML-Code angegeben.
<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>
Hier ist die Implementierung von click Ereignis, bei dem die Quote erhöht wird.
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!";
}
}
}
}
}
Wenn der obige Code kompiliert und ausgeführt wird, wird die folgende Ausgabe angezeigt.
Wenn Sie klicken Increaseerscheint die Eingabeaufforderung. Es bittet darum, die zu erhöhenQuota 10 KB größer sein als alles, was es bereits ist.
Wenn Sie klicken YesAnschließend wird der verfügbare Kontingentbetrag ausgedruckt.
Wir empfehlen Ihnen, die obigen Beispiele zum besseren Verständnis auszuführen.