Silverlight - Archiviazione isolata
Il terzo meccanismo di accesso ai file è Isolated Storagemeccanismo, che fornisce l'archiviazione associata all'utente connesso. L'API presenta i dati tramiteStream classe da .NET System.IOspazio dei nomi. Pertanto, come con gli altri meccanismi che abbiamo esaminato finora, puoi utilizzare gli altri tipi inSystem.IO per lavorare con i flussi, consentendo di memorizzare dati testuali o binari.
Alcune caratteristiche importanti sono:
Questo meccanismo di archiviazione è chiamato Isolated Storage perché il negozio è partizionato e un'applicazione Silverlight ha accesso solo a determinate parti.
Non è possibile accedere a nessun vecchio dato memorizzato. Prima di tutto, il negozio è partizionato per utente. Un'applicazione Silverlight non può accedere allo store per un utente diverso da quello che ha effettuato l'accesso e che esegue l'applicazione.
Questo non ha nulla a che fare con i meccanismi di identificazione che la tua applicazione web potrebbe utilizzare. Questo è un punto importante da ricordare perché alcune persone che condividono computer non si preoccupano di account Windows separati e sono abituati solo ad accedere e disconnettersi dai siti Web che utilizzano.
Utilizzo dell'archiviazione isolata
L'archiviazione isolata non è esclusiva di Silverlight. L'API è stata originariamente introdotta perWindows Formsper consentire alle applicazioni avviate dal Web di archiviare i dati in locale in scenari di attendibilità parziale. L'implementazione è diversa e non è possibile accedere alla versione completa.NET Archiviazione isolata di Framework da Silverlight o viceversa.
Tuttavia, se l'hai usato, i passaggi qui ti sembreranno molto familiari.
Inizi chiedendo il negozio specifico dell'utente. In questo caso, chiediamo quello per l'applicazione. Se volessimo che lo store per sito fosse condiviso da tutti gli XAP del sito, chiameremmoGetUserStoreForSite anziché.
Entrambi i metodi restituiscono un file IsolatedStorageFile oggetto, che è un nome piuttosto inutile in quanto rappresenta una directory, non un file.
Per accedere a un file, è necessario chiedere al IsolatedStorageFile per un Stream.
Noi usiamo il IsolatedStorageFileStream class e il suo costruttore richiede di passare il IsolatedStorageFile oggetto come argomento.
Quindi stiamo creando un nuovo file nel negozio. La posizione esatta del file sul disco è sconosciuta.
La directory contenente ha elementi randomizzati in modo da rendere impossibile indovinare il nome del file.
Senza questo, potrebbe essere possibile per siti Web dannosi posizionare un file sul computer dell'utente e quindi creare un URL di file per aprirlo, nella speranza di indurre l'utente a fare clic su un collegamento che esegue un programma in locale.
Ci sono varie altre protezioni integrate in Windows che cercano di impedire che ciò accada, ma questo è un altro livello di difesa nel caso in cui gli altri siano stati in qualche modo disabilitati o aggirati.
Il file verrà archiviato da qualche parte all'interno del profilo dell'utente, ma questo è quanto puoi sapere al riguardo. Il tuoIsolatedStorageFileStream non riporterà la sua vera posizione.
Diamo un'occhiata a un semplice esempio che tiene traccia di quante volte l'applicazione è stata eseguita. Di seguito è riportato il codice XAML.
<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>
Ecco il codice C # in cui Isolated storage sono usati.
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)";
}
}
}
Quando il codice sopra è stato compilato ed eseguito, vedrai la seguente pagina web che ti mostrerà quante volte esegui questa applicazione.
Aumentare la tua quota
Le applicazioni possono richiedere più spazio se l'importo iniziale non è sufficiente per qualche motivo. Non vi è alcuna garanzia che la richiesta avrà successo. Silverlight chiederà all'utente se desidera concedere più spazio all'applicazione.
A proposito, puoi solo chiedere più spazio di archiviazione in risposta all'input dell'utente, come un file click. Se provi a chiederlo un'altra volta, ad esempio quando il plug-in viene caricato o in un gestore del timer, Silverlight fallirà automaticamente la richiesta senza nemmeno chiedere all'utente. La quota aggiuntiva è disponibile solo per le applicazioni con cui l'utente sta interagendo.
Il IsolatedStorageFile L'oggetto fornisce tre membri per la gestione della quota:
- AvailableFreeSpace
- IncreaseQuotaTo
- Quota
AvailableFreeSpace
La proprietà AvailableFreeSpace ti dice quanta parte della tua quota rimane libera.
Nota che anche una sottodirectory vuota consuma parte della tua quota perché il sistema operativo ha bisogno di allocare spazio su disco per rappresentare la directory. Quindi, lo spazio disponibile potrebbe essere inferiore alla quota totale, meno la dimensione della somma di tutti i tuoi file.
Aumenta QuotaTo
Se non hai spazio sufficiente per procedere, chiedi di più chiamando il IncreaseQuotaTo metodo.
Quota
Qui stiamo usando la terza proprietà, Quota, per scoprire la dimensione della quota corrente, quindi aggiungeremo l'importo extra necessario per ottenere la nuova quota richiesta.
Il metodo restituisce entrambi True o Falseper indicare se ci viene assegnato ciò che abbiamo chiesto. Tieni presente che Silverlight potrebbe decidere di allocare più spazio di quanto richiesto.
Ecco un semplice esempio per aumentare il quota, quando si fa clic sul pulsante. Di seguito è riportato il codice XAML.
<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>
Ecco l'implementazione di click evento in cui la quota viene aumentata.
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!";
}
}
}
}
}
Quando il codice sopra viene compilato ed eseguito, vedrai il seguente output.
Quando fai clic su Increase, viene visualizzato il prompt. Chiede di aumentare ilQuota essere 10 KB più grande di qualunque cosa sia già.
Quando fai clic su Yes, quindi stampa la quantità di quota disponibile.
Ti consigliamo di eseguire gli esempi precedenti per una migliore comprensione.