Silverlight - Armazenamento Isolado
O terceiro mecanismo de acesso ao arquivo é Isolated Storagemecanismo, que fornece armazenamento associado ao usuário conectado. A API apresenta dados por meio doStream classe de .NET System.IOnamespace. Portanto, como com os outros mecanismos que examinamos até agora, você pode usar os outros tipos emSystem.IO para trabalhar com os fluxos, permitindo armazenar dados textuais ou binários.
Alguns recursos importantes são -
Este mecanismo de armazenamento é chamado Isolated Storage porque a loja é particionada e um aplicativo Silverlight tem acesso apenas a certas partes.
Você não pode acessar quaisquer dados armazenados antigos. Em primeiro lugar, o armazenamento é particionado por usuário. Um aplicativo Silverlight não pode obter acesso à loja para um usuário diferente daquele que está conectado e executando o aplicativo.
Isso não tem nada a ver com quaisquer mecanismos de identificação que seu aplicativo da web possa usar. Esse é um ponto importante a ser lembrado porque algumas pessoas que compartilham computadores não se preocupam com contas separadas do Windows e estão acostumadas apenas a fazer login e logout nos sites que usam.
Usando armazenamento isolado
O armazenamento isolado não é exclusivo do Silverlight. A API foi originalmente introduzida paraWindows Formspara permitir que aplicativos iniciados da web armazenem dados localmente em cenários de confiança parcial. A implementação é diferente, e não há como acessar o completo.NET Armazenamento isolado do Framework do Silverlight ou vice-versa.
No entanto, se você o tiver usado, as etapas aqui parecerão muito familiares.
Você começa perguntando sobre a loja específica do usuário. Neste caso, estamos solicitando aquele para o aplicativo. Se quiséssemos que o armazenamento por site fosse compartilhado por todos os XAPs no site, chamaríamosGetUserStoreForSite em vez de.
Qualquer método retorna um IsolatedStorageFile objeto, que é um nome bastante inútil, pois representa um diretório, não um arquivo.
Para acessar um arquivo, você precisa perguntar ao IsolatedStorageFile para Stream.
Nós usamos o IsolatedStorageFileStream classe, e seu construtor exige que você passe o IsolatedStorageFile objeto como um argumento.
Portanto, estamos criando um novo arquivo na loja. A localização exata do arquivo no disco é desconhecida.
O diretório que o contém possui elementos aleatórios para tornar impossível adivinhar o nome do arquivo.
Sem isso, pode ser possível que sites maliciosos coloquem um arquivo no computador do usuário e, em seguida, construam uma URL de arquivo para abri-lo, na esperança de enganar o usuário fazendo-o clicar em um link que executa um programa localmente.
Existem várias outras salvaguardas incorporadas ao Windows que tentam evitar que isso aconteça, mas esta é outra camada de defesa caso as outras tenham sido desabilitadas ou contornadas de alguma forma.
O arquivo será armazenado em algum lugar dentro do perfil do usuário, mas isso é tudo que você pode saber sobre ele. SeuIsolatedStorageFileStream não relatará sua verdadeira localização.
Vamos dar uma olhada em um exemplo simples que rastreia quantas vezes o aplicativo foi executado. A seguir está o código 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>
Aqui está o código C # em que Isolated storage são usados.
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 o código acima for compilado e executado, você verá a seguinte página da Web que irá mostrar quantas vezes você executa este aplicativo.
Aumentando sua cota
Os aplicativos podem pedir mais espaço se a quantidade inicial for insuficiente por algum motivo. Não há garantia de que a solicitação será bem-sucedida. O Silverlight perguntará ao usuário se ele deseja conceder mais espaço ao aplicativo.
A propósito, você só tem permissão para solicitar mais armazenamento em resposta à entrada do usuário, como um click. Se você tentar perguntar em outro momento, como quando o plug-in é carregado ou em um manipulador de cronômetro, o Silverlight irá automaticamente falhar na solicitação, mesmo sem avisar o usuário. A cota extra está disponível apenas para os aplicativos com os quais o usuário está interagindo.
o IsolatedStorageFile objeto fornece três membros para o gerenciamento de cotas -
- AvailableFreeSpace
- IncreaseQuotaTo
- Quota
AvailableFreeSpace
A propriedade AvailableFreeSpace informa quanto de sua cota permanece livre.
Observe que mesmo um subdiretório vazio consome parte de sua cota porque o sistema operacional precisa alocar espaço em disco para representar o diretório. Portanto, o espaço disponível pode ser menor que a cota total, menos o tamanho da soma de todos os seus arquivos.
GrowQuotaTo
Se você não tiver espaço suficiente para prosseguir, peça mais, ligando para o IncreaseQuotaTo método.
Contingente
Aqui estamos usando a terceira propriedade, Quota, para descobrir o tamanho da cota atual e, então, adicionaremos a quantidade extra de que precisamos para obter nossa nova cota solicitada.
O método retorna True ou Falsepara indicar se recebemos o que solicitamos. Observe que o Silverlight pode decidir alocar mais espaço do que você solicitou.
Aqui está um exemplo simples para aumentar o quota, quando o botão é clicado. A seguir está o código 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>
Aqui está a implementação de click evento em que a cota é aumentada.
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 o código acima for compilado e executado, você verá a seguinte saída.
Quando você clica Increase, o prompt aparece. Ele pede para aumentar oQuota ser 10 KB maior do que o que já é.
Quando você clica Yes, ele então imprime a quantidade de cota disponível.
Recomendamos que você execute os exemplos acima para melhor compreensão.